直接从C#调用托管c ++失败

时间:2010-01-19 17:22:53

标签: c# c++

让A.dll成为托管c ++项目(没有其他依赖项) 来自B.dll这是一个C#项目,其中A.dll被引用有一个Nunit方法foo()。 如果从foo()调用托管c ++代码,我得到 FileNotFoundException:找不到指定的模块。 (HRESULT异常:0x8007007E)。

我尝试将B.dll更改为控制台应用程序,并发生同样的异常。 如果我将托管的c ++代码包装在B.dll中的其他c#类中,然后从foo()调用包装器,一切正常。

托管C ++是一个静态类,其中所有函数参数都是托管类型。

想法?

谢谢, 盖

4 个答案:

答案 0 :(得分:2)

这不是托管DLL加载错误,您无法在Fuslogvw.exe中看到它。我猜测无法找到C ++ / CLI程序集的非托管DLL依赖项。您将能够看到Windows使用SysInternals的ProcMon实用程序搜索DLL。

答案 1 :(得分:1)

使用fuslogvw查看它从哪里尝试加载托管dll。这会告诉你应该把它放在哪里。

答案 2 :(得分:0)

您必须将C ++ DLL放入NUnit DLL所在的文件夹中,否则它将无法找到要加载的C ++ DLL。

答案 3 :(得分:0)

好吧,我想我明白了,如果我错了请纠正我...... 由于我直接从C#代码调用MC ++,一些预加载过程“知道”我正在调用MC ++,因此尝试加载MC ++和依赖的C ++本机库,因为它们不在%PATH%,当前目录(本土图书馆)它失败了。

当我调用由C#类包装的MC ++时,加载阶段将在稍后完成(我有一个C#代码将%PATH%推入原生dll的路径,在前一种情况下甚至没有达到此代码... 。)因此成功。

所以我的选择是将原生c ++路径不断地放入%PATH%而不是在运行时尝试(仅按运行过程)。

思想?

相关问题