繁体   English   中英

如何在C#应用程序中调用C ++中的C#函数,以便C ++堆栈正确解开?

[英]How to call a throwing C# function from C++ in a C# app such that the C++ stack is unwound properly?

是否可以从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 ++异常 - >“是和SEH异常(/ EHa)”)。 如果没有SEH异常,返回到C ++层的异常没有足够的信息来正确展开堆栈。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM