.net - 通过 c++/cli 层从 c++ dll 使用 .net dll 时出现问题

标签 .net c++ interop

我有一个 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/

相关文章:

c# - Func<Task> 伪装成 Action

c++ - 如何轻松地将字符串转换为键盘字符

c# - 挂起互操作 COM 对象的问题

c# - 使用 Open Xml 将列添加到现有 Excel 2007 工作簿

c# - LINQ 是否缓存计算值?

c++ - 在 C++ 中查找字符数组的长度

使用非托管代码的 C# 应用程序加载 msvcr90.dll + msvcr80.dll + msvcr100.dll。这有关系吗?

c# - 使用 Interop 在 C# 中打开 Excel 文件时出现异常

asp.net - 当数据源是 EF 上下文时,使用 Asp.Net MVC 3 的哪种方法

c++ - 如何使用 Boost.Asio 解析主机(仅)?