我有一个 c++ dll,在某个时候,它需要将任务委托(delegate)给用 .Net 编写的 dll。为此,我创建了一个 c++/cli 静态库,它使用/使用 .net dll 来完成一些任务。然后我将 c++/cli 静态库与 c++ dll 静态链接。它看起来像这样。
cli.aTask() netdll.aTask()
c++ dll ----------> c++/cli ----------------> .net dll
< static link > <normal assembly inclusion>
现在,b/w c++dll 和 c++/cli 的连接正常了。我可以在 c++/cli 层中使用 .net 库做任何事情,然后从 c++dll 中调用它。但是当我从 .net dll 创建一个类的对象,或访问 .net dll 类的静态方法时,我在 c++dll 中出现异常(实际上是 c++dll 崩溃,没有异常)。以下是我收到的消息。
foo.exe is using c++dll
Unhandled exception at 0x7c812aeb in "foo.exe": OxE0434f4d: 0xe0434f4d.
c++dll代码调用cli方法:
CLILibrary::CCLILib lib;
lib.GetUsersInput();
cli 代码调用.net dll:
DotNetLibrary::DotNetClass::aMethod(); // static method`
.net dll类代码:
namespace DotNetLibrary
{
public class DotNetClass
{
public DotNetClass(){}
public static void aMethod(){}
}
}
现在,如果我不以任何方式在 c++/cli lib 中使用 DotNetLibrary::DotNetClass
,那么异常就不会出现了。
请帮忙。我的目标是从 c++ dll 调用 .net lib,如果有更好的方法,那也很好。提前致谢。
最佳答案
Unhandled exception at 0x7c812aeb in "foo.exe": OxE0434f4d: 0xe0434f4d
0xe0434f4d 是托管异常的异常代码。您编写的托管代码正在轰炸,任何地方都没有捕获该异常的处理程序。如果您不在托管模式下运行调试器,那将是一个没有适当诊断的 kaboom。
您需要在 C++/CLI 代码中使用 try/catch 关键字来捕获 System::Exception,从捕获的异常对象的 ToString() 值生成诊断并传递某种“他死了 Jim”状态代码回到您的 native 代码。在此之后不要尝试继续使用托管代码,它已经死了,处于不可预测的状态。
关于.net - 通过 c++/cli 层从 c++ dll 使用 .net dll 时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5192940/