gpt4 book ai didi

c# - 处理从 C++/MFC 应用程序中的 .NET dll 抛出的异常

转载 作者:行者123 更新时间:2023-11-30 04:36:41 25 4
gpt4 key购买 nike

我正在使用一个 C++ 应用程序,它通过 COM 与 C#.NET 组件进行交互。由于 .NET dll 抛出的一些异常,我的 C++ 应用程序崩溃了,尽管所有异常处理机制都已到位。是否可以在 C++ 代码中捕获 .NET dll 抛出的异常?怎么办?

最佳答案

我不是 COM/.NET 互操作性方面的专家,但我希望 .NET 运行时永远不会让异常通过 COM 方法调用泄漏。相反,我猜运行时会将异常转换为实现 IErrorInfo 的对象。界面。

[编辑]我刚刚证实了我的假设。正如我所怀疑的,以下代码打印出“一个点网络异常...”。

// SERVER: C#
using System.Runtime.InteropServices;

namespace COMInteroperability
{
[Guid("6650E916-B507-483e-9804-8EEDA770F76C")]
interface IFoo
{
[ComVisible(true)]
string Bar(int value);
}

[ClassInterface(ClassInterfaceType.AutoDual)]
[Guid("92377D62-32CB-4b2b-AE79-B256F54B3E17")]
public class Foo : IFoo
{
public string Bar(int value)
{
throw new Exception("A dotnet exception...");
}
}
}


// CLIENT: C++
#include "stdafx.h"
#import "G:\temp\COMInteroperability\COMInteroperability\COMInteroperability\bin\Debug\COMInteroperability.tlb" no_namespace names_guids raw_interfaces_only

void CheckResult(HRESULT hr)
{
if (SUCCEEDED(hr)) return;

CComPtr<IErrorInfo> error;
if (FAILED(GetErrorInfo(0, &error))) return;

if (!error.p) return;

CComBSTR description;
error->GetDescription(&description);
wprintf(description.m_str);
}

int _tmain(int argc, _TCHAR* argv[])
{
CoInitialize(0);
{
CComPtr<_Foo> foo;

CLSID clsid;
CLSIDFromString(L"{92377D62-32CB-4b2b-AE79-B256F54B3E17}", &clsid);

HRESULT hr = foo.CoCreateInstance(clsid);

CheckResult(hr);
if (FAILED(hr))
{
printf("Error %x", hr);
return -1;
}

CComBSTR ret;
CheckResult(foo->raw_Bar(10, &ret));
}
CoUninitialize();
}

[/edited]

将调试器附加到您的进程并查看应用程序崩溃时的状态。

最佳

阿德里亚诺

关于c# - 处理从 C++/MFC 应用程序中的 .NET dll 抛出的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4459847/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com