c# - 如何在 C# 应用程序中从 C++ 调用抛出 C# 函数,以便正确展开 C++ 堆栈?

标签 c# c++ .net exception-handling interop

是否可以从 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);
}

连同此 C++ 代码:

void CppFunc(void (*handler))
{
   SomeResourceWrappingClass releasesResourceOnDestruction();
   handler();
}

我试过了,成功捕获了 C# 异常,但是 releasesResourceOnDestruction 没有调用它的析构函数。这似乎表明 C++ 堆栈没有正确展开——是否有可能让它在这里正确展开?是否有关于此行为的任何文档?

对于上下文:如果可能的话,我有时想从 C++ 代码中触发 C# 异常,这样我就不需要从 C# 到 C++ 的每次调用都必须事后检查某些内容以查看是否需要抛出 C# 异常。

最佳答案

尝试在您的 C++ 项目中启用结构化异常处理(项目属性 -> C/C++ -> 代码生成 -> 启用 C++ 异常 -> “Yes with SEH Exceptions (/EHa)”)。没有 SEH 异常,返回到 C++ 层的异常没有足够的信息来正确展开堆栈。

关于c# - 如何在 C# 应用程序中从 C++ 调用抛出 C# 函数,以便正确展开 C++ 堆栈?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25752545/

相关文章:

C# 4.0/EF - SQL Server Compact 不支持服务器生成的键和服务器生成的值

c++ - 计算 vector 子集中的出现次数

c++ - 清理 Qt 布局和添加其他小部件不起作用。幽灵小部件保留。 Qt 错误?

c# - 流式传输为 UTF8 字符串,不带 byte[]

c# - 构建组合矩阵

c# - msbuild/csproj 执行任务问题

c# - 面板控件中的对齐按钮

c++ - 跟踪进程和所有 fork 进程的系统调用

c# - 使用 Linq 从表中提取数据

.net - 沙箱 AppDomain 的 ApplicationBase 是否应该有所不同?