2016-04-08 10 views
0

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.CSharpSystem.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を実行しようとすると、開発マシンで同じエラーログが取得されています。

+1

最初に、どのファイルが不足しているかを理解する必要があります。 VC++ランタイムDLLを導入してインストールしましたか? –

+0

@AdrianoRepetti私はこれをインストールしましたが、これは助けにはなりません:https://www.microsoft。com/en-us/download/details.aspx?id = 51682 – Rich

+1

おそらくsysinternalsプロセスモニタを使用して、リアルタイムでファイルシステムコールを監視します。 (ランタイムアセンブリのバインディングの詳細については、fuslogvw.exeを参照してください) –

答えて

-1

コメントで説明したように、私はVisual C++ 2015 Redistributableをインストールしようとしました。これは当時は何の効果もなかったようだ。しかし、数日後、問題はもはや再現性がなくなり、それを修正したものは何も考えることができません。 (再頒布可能インストーラは再起動を要求しませんでしたが、実際には必要だったと思われます)

関連する問題