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

时间:2011-03-04 11:10:45

标签: .net c++ interop

我有一个c ++ dll,它在某个时刻需要将任务委托给用.Net编写的dll。为此我创建了一个c ++ / cli静态库,它使用.net dll来实现一些TASK。然后我静态地将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,如果有更好的方法,那么它也会很好。提前谢谢。

3 个答案:

答案 0 :(得分:1)

  

“foo.exe”中0x7c812aeb处的未处理异常:OxE0434f4d:0xe0434f4d

0xe0434f4d是托管异常的异常代码。您编写的托管代码是轰炸,没有处理该异常的处理程序。如果你没有在托管模式下运行调试器,那就是没有合适诊断功能的kaboom。

您需要在C ++ / CLI代码中使用try / catch关键字来捕获System :: Exception,从捕获的异常对象的ToString()值生成诊断并传递某种“他已死的Jim”状态代码回到您的本机代码。在此之后不要尝试继续使用托管代码,它已经无法预测状态。

答案 1 :(得分:1)

如前所述,您需要在.Net或C ++ / CLI模块中捕获(托管)异常。 我通常在我的C ++ / CLI .Net包装器中做的是捕获托管异常并将它们作为标准c ++重新抛出。 像

这样的东西
try {
   // ... managed call
}
catch (System::Exception^ e)
{
    throw std::exception(ConvertString(e->Message));
}

(其中ConvertString是一个将托管字符串转换为char *或std :: string的函数)。 通过这种方式,您仍然必须在本机代码中捕获异常,但不会丢失有关源错误的信息 (好吧,因为生成异常的原始代码中的callstack会丢失,但是如果你愿意的话你也可以保存它。)

答案 2 :(得分:0)

将foo.exe编译为控制台应用程序,并在没有调试器的情况下运行。当出现异常时,.NET将打印它的名称和附加信息。