JDi*_*teo 5 .net c# c++ interop exception-handling
是否可以从C#应用程序中的C++调用调用抛出C#函数,以便C++堆栈正确解开?有没有这方面的文件?
例如,请考虑这个C#代码:
using System;
public class Test
{
public static void CalledFromCpp()
{
throw new Exception("Is this safe? Is C++ stack unwound properly?");
}
public static void Main()
{
try {
CppFunc(CalledFromCpp);
}
catch(Exception e)
{
Console.Writeline("Exception e: {0}", e);
}
}
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
delegate void CsFuncToBeCalledFromCpp();
[DllImport("CppApp", CallingConvention = CallingConvention.Cdecl)]
private static extern void
CppFunc(CsFuncToBeCalledFromCpp callback);
}
Run Code Online (Sandbox Code Playgroud)
与此C++代码一起:
void CppFunc(void (*handler))
{
SomeResourceWrappingClass releasesResourceOnDestruction();
handler();
}
Run Code Online (Sandbox Code Playgroud)
我试了一下,C#异常被成功捕获,但releasesResourceOnDestruction没有调用它的析构函数.这似乎表明C++堆栈没有正确解开 - 是否有可能在这里正确展开?有关于此行为的任何文档吗?
对于上下文:如果可能的话,我希望有时会从C++代码中触发C#异常,这样我就不需要从C#到C++的每次调用都需要事后检查一下,看看是否需要抛出C#异常.
尝试在 C++ 项目中启用结构化异常处理(项目属性 -> C/C++ -> 代码生成 -> 启用 C++ 异常 -> “是,使用 SEH 异常 (/EHa)”)。如果没有 SEH 异常,则返回到 C++ 层的异常没有足够的信息来正确展开堆栈。
| 归档时间: |
|
| 查看次数: |
186 次 |
| 最近记录: |