2013-05-28 485 views
7

私はC#exe内から呼び出したいアンマネージドC++ DLLを持っています。私は可能な解決策を検討しましたが、C++/CLIをアンマネージC++クラスのラッパーとして使用するのが最善の方法です。だから、私はこのように見えるC++/CLIクラスを書いて、DLLにコンパイルされます(私はデストラクタとファイナライザを持っているはずですが、今のところコードはMain関数に入りませんので、簡略化のため):私がしようとすると、コードを実行したとき、私は、次のC++の例外を取得し、残念ながらEEFileLoadException管理DLLにC++ DLLをロードするとき

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

using DependencyInterface; 

namespace DependencyTest2 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      DependencyTester tester; 
     } 
    } 
} 

First-chance exception at 0x000007fefd5a9e5d in DependencyTest2.exe: Microsoft C++ exception: EEFileLoadException * __ptr64 at memory location 0x0094ca58.. 

#include <cppheader.h> 

using namespace System; 

namespace DependencyInterface 
{ 
    public ref class DependencyTester 
    { 
    public: 
    DependencyTester() 
    { 
     _class = new CPPClass(); 
    } 

    private: 
    CPPClass* _class; 
    }; 
} 

私は、このようになりますC#の実行可能ファイルを持っています

私は設定しようとしましたMainの最初の行にブレークポイントがありますが、実行がそのポイントに達する前に例外がスローされます。私が「続ける」(MVS 2010を使用しています)を押すと、私はこれを得ます:

First-chance exception at 0x76d8c5e2 in DependencyTest2.exe: 0xC0000005: Access violation reading location 0x0000000000000020. 

誰かアドバイスをありますか?これはWindows 7 x64上にあり、C++ DLLを含むx64用にすべてコンパイルされています。

+1

コールを行うにはスタックトレースを確認する必要があります。しかし、まず、デバッガを管理モードに切り替えて、実際の管理例外を確認してください。 –

答えて

6

EEFileLoadExceptionは、実行可能ファイルが依存関係の1つを見つけたり読み込めなかったことを示します。それはもちろん、さまざまな原因があります(パスの問題、ミキシングの設定、プラットフォームのミキシング)。

良いスタートは、DLLの/実行可能ファイルでDependency Walker(x64版を使用してください)を使用することです。

+0

それは永遠にかかった!ええ、問題は、私のC++ライブラリがリンクされているライブラリででした。 –

1

私はC#プロジェクトでdllを参照していたのと同様の問題がありました。参照されたDLL自体は、私の解決策には含まれていない他のDLLに依存していました。この問題は、私のソリューションの欠落しているDLLへの参照を追加した後に解決されました。また、不足しているDLLをアプリケーションディレクトリに直接コピーすることもできます。 Dependency Walkerを使用すると、不足しているDLLの名前が表示されないため、役立たずにいました。

関連する問題