从c+;使用.net dll时出现问题+;通过c++/cli层 我有一个C++ DLL,它在某个点上需要委派一个任务到.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> 调用cli方法的c++dll代码: 调用.net dll的cli代码: .net dll类代码:
现在,如果我在c++/cli库中不以任何方式使用从c+;使用.net dll时出现问题+;通过c++/cli层 我有一个C++ DLL,它在某个点上需要委派一个任务到.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> 调用cli方法的c++dll代码: 调用.net dll的cli代码: .net dll类代码:,.net,c++,interop,.net,C++,Interop,现在,如果我在c++/cli库中不以任何方式使用DotNetLibrary::DotNetClass,那么异常将停止出现 请帮忙。我的目标是从C++ DLL调用.NET LIB,如果有更好的方法,那么它也会很好。提前感谢。将foo.exe编译为控制台应用程序,并在没有调试器的情况下运行。出现异常时,.NET将打印其名称和附加信息 “foo.exe”中0x7C812EB处未处理的异常:OxE0434f4d:0xe0434f4d 0xe0434f4d是托管异常的异常代码。您编写的托管代码正在爆炸,任
DotNetLibrary::DotNetClass
,那么异常将停止出现
请帮忙。我的目标是从C++ DLL调用.NET LIB,如果有更好的方法,那么它也会很好。提前感谢。将foo.exe编译为控制台应用程序,并在没有调试器的情况下运行。出现异常时,.NET将打印其名称和附加信息 “foo.exe”中0x7C812EB处未处理的异常:OxE0434f4d:0xe0434f4d 0xe0434f4d是托管异常的异常代码。您编写的托管代码正在爆炸,任何地方都没有捕获该异常的处理程序。如果不在托管模式下运行调试器,那么这就是一个没有良好诊断的kaboom
您需要在C++/CLI代码中使用try/catch关键字来捕获System::Exception,从捕获的异常对象的ToString()值生成诊断,并将某种“he's dead Jim”状态代码传递回您的本机代码。在此之后,不要尝试继续使用托管代码,因为托管代码的状态不可预测。如前所述,您需要在.Net或C++/CLI模块中捕获(托管)异常。 我在C++/CLI.NET包装器中通常做的是捕获托管异常并将它们重新作为标准C++来抛出。 差不多
try {
// ... managed call
}
catch (System::Exception^ e)
{
throw std::exception(ConvertString(e->Message));
}
(其中ConvertString是将托管字符串转换为char*或std::string的函数)。
这样,您仍然必须在本机代码中捕获异常,但不会丢失有关源错误的信息
(从调用代码栈中产生的异常,其他的信息会丢失,但如果你想保存,也可以保存。)/P>Fo.EXE实际上是Acrobat.exe,而我的C++ DLL实际上是AcROAT插件DLL。所以编译Acrobat.exe不是一个选项。@Jahangir:您可以修复Acrobat.exe的PE头,使其成为控制台应用程序。您的诊断确实指出了一些问题。我将当前的.net dll替换为一个旧的.net dll,该dll正在工作,没有发生异常。现在,我必须检查我的.NETDLL有什么问题。非常奇怪的是,它几乎是空的,因此,一定有一些配置问题。当我得到一些东西时,我会更新。使用调试器。然后写代码,这将在你不靠近的情况下轰炸你客户的机器。好的,我发现了问题。我用另一个工作正常的.net dll替换了我的.net dll,它工作正常。因此,我查看了.net lib项目属性,发现我的新.net dll没有添加到gac中,要将其添加到gac中,还必须对其进行签名。所以我签署了我的dll并将其添加到gac中,同一个给出异常的.net dll现在运行良好。Thnks表示对.net代码的支持,thnx表示对该建议的支持,abt catting n rethrowning。我会记住这一点。
CLILibrary::CCLILib lib;
lib.GetUsersInput();
DotNetLibrary::DotNetClass::aMethod(); // static method`
namespace DotNetLibrary
{
public class DotNetClass
{
public DotNetClass(){}
public static void aMethod(){}
}
}
try {
// ... managed call
}
catch (System::Exception^ e)
{
throw std::exception(ConvertString(e->Message));
}