调用回调函数时出现C#异常

3

我已经创建了这个代码来从C代码中调用未托管的函数。pCallback是一个函数指针,因此在托管端是一个委托。

[DllImport("MyDLL.dll")]

public static extern Result SetCallback(
            IntPtr handle,
            Delegate pCallback,
            CallbackType Type);

现在我正在设置

private delegate void pfnCallback(uint PromptID, ttsEventType evt, IntPtr lData);
private pfnCallback cb = new pfnCallback(cback);

public Form1()
{

    (...)
    Wrapper.SetCallback(handle, cb, IntPtr.Zero, CallBackType.DEFAULT);
    (...)
    public static void cback(uint PromptID, ttsEventType evt, IntPtr lData)
    { }
    }

调试时,我发现它运行了一次cback函数,然后我收到了一个没有数据的异常,只是说“在WindowsApp2.vshost.exe[4372]中发生了未处理的win32异常”。我不明白出了什么问题。有人可以帮我吗?

4个回答

2
这里没有太多细节,但我猜测可能是调用约定问题。当使用 DllImport 时,我总是尝试明确设置调用约定;
[DllImport("msvcrt.dll", CharSet=CharSet.Unicode, CallingConvention=CallingConvention.Cdecl)]
public static extern int printf(String format, int i, double d); 

调用约定可以影响参数在调用堆栈上的放置方式以及之后如何清理这些参数。

请参见此处

您需要从未托管库提供的标头或文档中找到正确的约定。


2

1

尝试使用

[UnmanagedFunctionPointer(CallingConvention.xxx, CharSet = CharSet.xxx)]
public delegate ...

1

你必须确保回调函数的引用不会被垃圾回收器收集。回调函数的引用必须在托管内存中保持活动状态,直到预期调用回调函数为止。

解决这个问题的一种方法是创建一个托管 C++ 中间层。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接