gpt4 book ai didi

C# 互操作 AccessViolationException 与托管回调

转载 作者:太空宇宙 更新时间:2023-11-03 14:21:41 25 4
gpt4 key购买 nike

我有一个非托管 dll,它分配一个结构并传递一个指向该结构的指针。我已经创建了一个与该结构等效的 C#,并且可以愉快地编译和运行我的代码来使用它。该结构中有一个可选指针,允许您连接一个函数指针,该函数指针将在非托管代码运行时调用。当我尝试将托管委托(delegate)挂接到结构的指针并将其传回时,它会因 AccessViolationException 而爆炸。我错过了什么?

更多细节:

非托管 C 代码:

typedef struct MyStruct {
:
:
int flags
:
int (*cback)(MyStruct *s, Other *o)
:
} MyStruct;

C# 等价物:

[StructLayout(LayoutKind.Sequential)]
public class MyStruct
{
:
:
[MarshalAs(UnmanagedType.I4)]
public int flags;
:
public IntPtr cback;
:
};

得到一个指向非托管结构的指针我

managedMyStruct = (MyStruct)
Marshal.PtrToStructure(pUnmanagedMyStruct, typeof(MyStruct));

managedMyStruct.cback =
Marshal.GetFunctionPointerForDelegate(ManagedDelegateRef);

// Update pointer
Marshal.StructureToPtr(managedMyStruct, pUnmanagedStruct, true);

当我将 pUnmanagedStruct 传递给最终调用 cback 的非托管函数时,我的 cback 委托(delegate)被调用一次,应用程序因 AccessViolationException 而崩溃。

感谢收到任何线索。

一个

最佳答案

ManagedDelegateRef 指向什么?静态方法还是实例方法?如果它是实例方法,请确保该实例不会被垃圾回收。

关于C# 互操作 AccessViolationException 与托管回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5160426/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com