3

Windows デスクトップ (管理者) に Microsoft Visual Studio Express 2012 を使用しています。

FOO.DLL「出力ディレクトリにコピー」をクリックして「常にコピー」したプロジェクトライブラリがあります。

ほとんどの場合、この DLL は正しくロードされ、誰もが満足しています。

ときどき、次のようなSystem.DllNotFoundExceptionメッセージが表示されます。

Additional information: Unable to load DLL 'FOO.DLL': 
Invalid access to memory location. (Exception from HRESULT: 0x800703E6)

このエラーは、デバッグとリリースの両方で発生します。これは、「クリーン」の後、同じビルドを 2 回または 8 回実行した直後に発生します。

これは DLL、.NET ランタイム、または .NET コードのエラーですか?

4

2 に答える 2

4

メモリ位置へのアクセスが無効です。(HRESULT からの例外: 0x800703E6)

このエラー コードは、その DLL 内のコードが AccessViolation で失敗した場合に返されます。特別なコードで、DLL の読み込み中の非常に重要なタイミングで実行されます。不正なコードは、DLL の DllMain() エントリポイントにあります。その例外は飲み込まれ、Windows ローダーを安定に保つために必要であり、表示されるのはそれが生成するエラー コードだけです。

これは非常に重大な事故であり、DLL の作成者と協力してこの問題を解決する必要があります。例外をデバッグし、Debug + Exceptions を使用して、Win32 Exceptions の Thrown チェックボックスをオンにします。[ツール + オプション]、[デバッグ]、[一般] の [マイ コードのみのデバッグ] がオフになっていることを確認します。アンマネージ デバッグ、[プロジェクト + プロパティ]、[デバッグ] タブを有効にします。例外がスローされると、デバッガーは停止します。DLL のソース コードがない場合は、参照するものがほとんどなく、問題を解決するためにできることは何もないため、作成者の助けが必要です。彼は、スタック トレース ウィンドウの内容で問題を解決したいと考えています。

于 2013-10-04T18:29:09.133 に答える
0

Visual Studio は、あるプロジェクトから次のプロジェクトへのこれらの依存関係を追跡するのにあまり適していません。あなたのプロジェクト (FOO.DLL を含む) が後で別のプロジェクトに含まれる場合、Visual Studio が常にこの余分なファイルを最上位プロジェクトに適切に運ぶとは限らないと思います。

これらのファイルが適切に引き継がれるように (そしてクリーン時に削除されるように)、プロジェクトのコンテンツをスクラブする小さな MSBuild タスクを作成する必要がありました。とは言っても、私たちのプロジェクトのレイアウトは、YMMV の型にはまらない複雑な側面が少しありました。

簡単に言えば、最初に調べてファイルが続くことを確認する場所です。これに対する最短の(最もきれいではありませんが)意味は、それを必要とする元のプロジェクトが含まれているプロジェクトに FOO.DLL を再度追加することです。小さな構造ではうまく機能しますが、より大きなプロジェクト構造では、MSBuild タスクまたはおそらくパッケージ展開ソリューション (Nuget 風) を調べます。

お役に立てれば

于 2013-10-04T17:05:29.950 に答える