1

そのため、C# .NET 2.0 のポータブル アプリケーション内にすべての依存関係 (管理されていないものを含む - ILMerge がない) を保持しようとしています。

最初は を使用して DLL をディスクに書き込むことに成功しFile.WriteAllBytes("DLLName.dll", Propertes.Resources.dll_name)、プログラムが DLL から読み取れるようにしましたが、書き込みに時間がかかり、混乱が生じることが問題でした。

代わりに、私は気づいたAssembly.Load。これは、リソースからプログラムに依存関係を読み取るために使用したコードです。

try
{
    // Load OpenHardwareMonitorLib
    Assembly.Load(Properties.Resources.lib_hardware_monitor);

    // Some computers explicitly require 32 or 64 bit versions of SQLite. Load either version depending on architecture.
    if (Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE") == "AMD64")
    {
        // 64 bit version
        Assembly.Load(Properties.Resources.lib_sqlite_x64);
    }
    else
    {
        // 32 bit version
        Assembly.Load(Properties.Resources.lib_sqlite_x86);
    }
}
catch ...

そして、それはうまくいくようです。まあ、少なくとも私のコンピュータでは。友達のPCのキャッチブロックに入ってしまいましたが、あなたが親切に書いてくれる回答は一石二鳥だと思います。

ただし、これは、プログラムがメイン アプリケーションに入ったときに、try/catch の後にコンピューターから取得したエラーです。

「ファイルまたはアセンブリ 'OpenHardwareMonitorLib、Version=0.4.0.0、Culture=neutral、PublicKeyToken=null' またはその依存関係の 1 つを読み込めませんでした。指定されたファイルが見つかりません。」

もちろん、実際の DLL ファイルを探しています。さて、どうすればこれを修正できますか?

追加の詳細

OpenHardwareMonitorLib には外部依存関係はありません。また、質問を更新して、try/catch ブロックの後に自分のコンピューターでも、表示された try/catch ブロックで失敗た友人のコンピューターでも機能しないという事実を明確にしました。

4

3 に答える 3

1

Assembly.Load(byte[]) オーバーロードを使用しています。これは、一般的にアセンブリをロードするのにかなり面倒な方法です。ここで発生している特定の問題は、混合モードのアセンブリを読み込もうとしているということです。SqlLite には、ネイティブ コードとマネージド コードの両方が含まれています。使用しているオーバーロードは、純粋なマネージ アセンブリのみをサポートしています。

このようにすることはできません。

あなたの問題に対するシンプルで普遍的な解決策をお勧めします.これは、UACを備えたマシンでも機能し、あなたがやろうとしていることを止めるものです. 「setup.exe」という名前の単一の実行可能ファイル。

于 2012-04-18T18:02:07.760 に答える
0

犯人は、それ自体ではなく、DLLの依存関係の1つである可能性が最も高いです。したがって、コードはおそらく問題ありませんが、依存関係をマシンにインストールする必要があります。

fuslogvwを使用してエラーを確認できます。

于 2012-04-18T15:56:26.103 に答える
0

友人のコンピューターにない依存 dll の 1 つかもしれません。それらを識別するには、Fusion Log Viewer を使用してください。

http://msdn.microsoft.com/en-us/library/e74a18c4(v=vs.71).aspx

于 2012-04-18T15:57:20.737 に答える