检测 DLL 何时引发异常
Posted
技术标签:
【中文标题】检测 DLL 何时引发异常【英文标题】:Detecting when a DLL has raised an exception 【发布时间】:2017-03-12 19:23:53 【问题描述】:好的,所以我有了 C# DLL 方法:
public void DeletePublisher(string strName)
try
if (_PublisherData.PublisherDictionary.ContainsKey(strName))
_PublisherData.PublisherDictionary.Remove(strName);
catch (Exception ex)
SimpleLog.Log(ex);
它工作正常。如果有异常,则会被检测到并添加到日志中。
目前,在我的 C++ 项目中使用包装器通过 MFC 调用上述内容:
bool CMSATools::DeletePublisher(CString strPublisher)
bool bDeleted = false;
if (m_pInterface != nullptr)
CComBSTR bstrPublisher = strPublisher.AllocSysString();
throw_if_fail(m_pInterface->DeletePublisher(bstrPublisher));
bDeleted = true;
return bDeleted;
它们都工作正常。问题是 CPP 方法当前不知道 C# 方法失败的事实。现在,在这个特定的实例中,我知道我可以更改 DLL 方法的签名,以在发生异常失败时返回 false,并检查 CPP 文件中的返回值。
但是,在其他情况下,我已经在使用返回值,因此,为了保持一致性,我将 bool bExceptionRaised
参数传递给 DLL 中的方法。
这样,我可以在方法似乎完成时测试该值,如果它是错误的,则采取相应的行动。
目前我的应用程序没有意识到发生了异常,这是混乱。
我可以假设这两种方法中的任何一种都是我试图检测的最简单的方法吗?
更新
根据提供的答案,我尝试关注tutorial,但我感到很困惑。我试图遵循它,但我无法创建 CLR DLL 并构建它作为我的 C# DLL 文件的桥梁。
虽然我很欣赏这个答案,但我觉得它破坏了我所做的一切,因为 C# DLL 已经处理并记录了它的异常。虽然我想学习如何为未来建造这座桥梁,但我仍然认为在那个时候也许仅仅改变我的签名就足够了。无论哪种方式,我尝试构建一个基本的桥梁都失败了。
【问题讨论】:
【参考方案1】:使用 C++/CLI 包装器来访问托管组件。
使用 C++/CLI,您可以直接使用 C# 组件捕获托管异常,您可以抛出本机异常,甚至返回 true 或 false……随心所欲。
void DoManagedStuff(SOMEDATA somedata)
try
auto sm = ConvertToSomeDataToManaged(somedata);
CallManagedCode(sm);
catch (Exception^ e)
throw CMyNativeException();
【讨论】:
谢谢。但我不知道该怎么做。 用 /CLR 编译你的程序的一部分,或者使用一个使用 /CLR 的单独的 DLL(我更喜欢这个)并在那里使用你所有的 C# 东西。互联网上有一堆代码如何做到这一点。我从不将 .NET 组件与 COM 一起使用。 我很抱歉,但我迷路了。我会更新我的问题。 我又在看这个了。你能给我看一个基本形式的CMyNativeException
的例子吗?谢谢。
我在这里似乎遇到的另一个问题是我无法弄清楚如何从非托管代码中正确调用 C++/CLI 包装器。以上是关于检测 DLL 何时引发异常的主要内容,如果未能解决你的问题,请参考以下文章
TaskDialog 引发异常:需要版本 6 中的 comctl32.dll
python 这意味着无论何时引发未捕获的异常,我都会立即得知发生了什么(完全回溯)。
使用 Graphics.GetHdc 时,System.Drawing.dll 引发了“System.ArgumentException”类型的未处理异常
“Emgu.CV.CvInvoke”的类型初始值设定项引发异常。
UWP 应用程序第一次崩溃,而不是每次都在 0x06515AE7 (Windows.UI.Xaml.dll) 处引发异常