我有一个非托管的C ++ DLL,我想在C#exe中调用它。我查看了可能的解决方案,在我看来,最好的办法是使用C ++ / CLI作为非托管C ++类的包装器。所以我写了一个看起来像这样的C ++ / CLI类,并编译成一个DLL(我知道它应该有一个析构函数和一个终结器,但到目前为止,代码不会进入Main函数,所以我将它们排除在外简单的缘故):
#include <cppheader.h>
using namespace System;
namespace DependencyInterface
{
public ref class DependencyTester
{
public:
DependencyTester()
{
_class = new CPPClass();
}
private:
CPPClass* _class;
};
}
然后我有一个C#可执行文件,如下所示:
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;
}
}
}
不幸的是,当我尝试运行代码时,我得到以下C ++异常:
First-chance exception at 0x000007fefd5a9e5d in DependencyTest2.exe: Microsoft C++ exception: EEFileLoadException * __ptr64 at memory location 0x0094ca58..
我尝试在Main的第一行设置断点,但在执行到达该点之前抛出异常。如果我点击“继续”(我正在使用MVS 2010),我会得到这个:
First-chance exception at 0x76d8c5e2 in DependencyTest2.exe: 0xC0000005: Access violation reading location 0x0000000000000020.
有没有人有任何建议?这是在Windows 7 x64上,并且已经为x64编译了所有内容,包括C ++ DLL。
答案 0 :(得分:7)
EEFileLoadException指示可执行文件无法找到或加载其中一个依赖项。这当然可以有不同的原因(路径问题,混合配置,混合平台)。
一个好的开始是在你的DLL /可执行文件上使用Dependency Walker(确保使用x64版本)。
答案 1 :(得分:2)
我有一个类似的问题,我在C#项目中引用了一个dll,引用的dll本身依赖于我在解决方案中没有包含的其他一些dll。在我的解决方案中添加对缺少的dll的引用之后,问题得以解决。或者,您可以将缺少的dll直接复制到应用程序目录。使用Dependency Walker没有帮助,因为他们没有显示缺失的dll的名称。