C++/CLI DLLとリンクするC#で書かれたシンプルな.NETアプリケーションを持っています それ自体がC++静的ライブラリ。C++/CLI DLLへの呼び出し時に.NETアプリケーションでファイルが見つかりません。
アプリケーションは、開発マシン(Windows 8)で正常に動作しますが、EXEと DLLを別のマシン(Windows 10)にコピーすると、起動時にすぐにクラッシュします( )。イベントビューアで探し
、私はクラッシュが原因未処理の例外 、System.IO.FileNotFoundException
になり、コールスタックが 例外がDLLへの呼び出しを行う関数で発生していることを示していることがわかります。
DLLの関数をすぐに返すように編集すると、クラッシュはまだ発生します。 呼び出しの前後にブロックtry-catch
を追加しても効果はありません。しかし、 コールを完全に削除すると、アプリケーションが実行されます。
EXEとDLLを 別の場所に移動しても、アプリケーションは開発ボックスで正常に動作します。しかし、 EXEがあるディレクトリからDLLを削除すると、まったく同じクラッシュが発生します。
これは、 他のマシンで実行すると、DLLが見つからないという問題があることを示しています。
アプリケーションとDLLの両方のプロジェクトは同じ Visual Studio 2015ソリューションに含まれており、アプリケーションは プロジェクトリファレンスを介してDLLにリンクされています。
アプリケーションは.NET 4.5.2をターゲットにし、他のマシンは.NET 4.6 をインストールします。アプリケーションプロジェクトの他の唯一の参考資料は、Microsoft.CSharp
とSystem.Core
など、 .NETの部分です。
このクラッシュを修正するにはどうすればよいですか?
EDIT:コメントで@Alex K.によって示唆されるように、私は次のログの抜粋獲得fuslogvw.exe
、とバインドの失敗をログに記録しようとした:だからを見つけることができないファイルがあると思われ
*** Assembly Binder Log Entry (08/04/2016 @ 14:47:02) ***
The operation failed.
Bind result: hr = 0x80070002. The system cannot find the file specified.
Assembly manager loaded from: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll
Running under executable D:\[Path]\[App Name].exe
--- A detailed error log follows.
=== Pre-bind state information ===
LOG: DisplayName = [DLL Name], Version=1.0.5941.28221, Culture=neutral, PublicKeyToken=null
(Fully-specified)
LOG: Appbase = file:///D:/[Path]/
LOG: Initial PrivatePath = NULL
LOG: Dynamic Base = NULL
LOG: Cache Base = NULL
LOG: AppName = [App Name].exe
Calling assembly : [App Name], Version=1.0.0.0, Culture=neutral, PublicKeyToken=null.
===
LOG: This bind starts in default load context.
LOG: No application configuration file found.
LOG: Using host configuration file:
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework64\v4.0.30319\config\machine.config.
LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind).
LOG: Attempting download of new URL file:///D:/[Path]/[DLL Name].DLL.
LOG: Attempting download of new URL file:///D:/[Path]/[DLL Name]/[DLL Name].DLL.
LOG: Attempting download of new URL file:///D:/[Path]/[DLL Name].EXE.
LOG: Attempting download of new URL file:///D:/[Path]/[DLL Name]/[DLL Name].EXE.
LOG: All probing URLs attempted and failed.
を私のDLL、そしてその.NETは 実際にファイルの正しい場所を探していますが、何らかの理由で が見つかりませんでした。
DLLを削除してEXEを実行しようとすると、開発マシンで同じエラーログが取得されています。
最初に、どのファイルが不足しているかを理解する必要があります。 VC++ランタイムDLLを導入してインストールしましたか? –
@AdrianoRepetti私はこれをインストールしましたが、これは助けにはなりません:https://www.microsoft。com/en-us/download/details.aspx?id = 51682 – Rich
おそらくsysinternalsプロセスモニタを使用して、リアルタイムでファイルシステムコールを監視します。 (ランタイムアセンブリのバインディングの詳細については、fuslogvw.exeを参照してください) –