好的,所以我有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已经处理并记录了它的异常。虽然我想学习如何为未来建立这座桥梁,但我仍然认为,或许只是在时间点改变我的签名就足够了。无论哪种方式,我的尝试是桥梁的基本构建失败。
答案 0 :(得分:1)
使用C ++ / CLI包装器访问托管组件。
使用C ++ / CLI,您可以直接使用C#组件捕获托管异常,您可以抛出本机异常,甚至返回true或false ......无论您想要什么。
void DoManagedStuff(SOMEDATA somedata)
{
try
{
auto sm = ConvertToSomeDataToManaged(somedata);
CallManagedCode(sm);
}
catch (Exception^ e)
{
throw CMyNativeException();
}
}