我有一个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.
CLILibrary::CCLILib lib;
lib.GetUsersInput();
DotNetLibrary::DotNetClass::aMethod(); // static method`
namespace DotNetLibrary
{
public class DotNetClass
{
public DotNetClass(){}
public static void aMethod(){}
}
}
现在,如果我在c ++ / cli lib中不以任何方式使用DotNetLibrary::DotNetClass
,那么异常就会停止。
请帮忙。我的目标是从c ++ dll调用.net lib,如果有更好的方法,那么它也会很好。提前谢谢。
答案 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将打印它的名称和附加信息。