Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从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 - Fatal编程技术网

从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+;使用.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是托管异常的异常代码。您编写的托管代码正在爆炸,任

现在,如果我在c++/cli库中不以任何方式使用
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));
}