1

我有几个非托管 C++ 编写的 lib 文件,我需要链接到托管 C++ dll。
然后我需要从 C# 应用程序调用这个托管 C++ 的函数。

第一步没问题 - 创建托管 C++ dll,我可以使用 ildasm 看到它导出了我需要的功能。但是,当我尝试从我的 C# 编写的测试应用程序中调用此函数时,它会说:

未知模块中发生了“System.IO.FileLoadException”类型的未处理异常。
无法加载由 {MyManagedCPP.dll} 导入的过程。

此消息来自 VS2010。
我做了一个简单的实验——从托管 C++ dll 中的所有 lib 文件中删除依赖项并重建它。
有了这个更改就可以了 - 应用程序启动,我可以从 C# 测试应用程序调用托管 C++ dll 的函数。

当 dll 与 lib 文件具有静态链接时,是否无法通过设计调用托管 c++ 函数?技术限制?还是有一些解决方法?

谢谢

4

1 回答 1

2

毫无疑问,您对本机 DLL 有隐式依赖。从这个问题中不清楚这可能是什么 DLL。例如,它可能是 msvcrxx.dll,本机 C++ 代码的运行时支持库。这将是相当糟糕的,你不想混合 CRT 版本。这样一个缺失的 DLL 会阻止 C++/CLI 程序集被加载,从而产生 FileLoadException。

如果您不知道该 DLL 可能是什么,那么您可以使用 SysInternals 的 ProcMon 实用程序。跟踪将显示程序正在搜索 DLL 而没有找到它。如果是 msvcrxx.dll,请确保使用与构建 C++/CLI 程序集相同的编译器版本重新构建 .lib 文件。如果是其他内容,请确保将该 DLL 复制到构建目录。

于 2013-05-23T01:49:39.633 回答