首页 > 解决方案 > C# 委托与 C 函数指针

问题描述

我有一个用 C 语言编写的 dll,我需要在我的 C# 应用程序中使用它。但是我有一个问题,我有一个使用下面结构的接口:

typedef struct {

int (*Func1)(void*, int*);
int (*Func2)(void*, int*);
       ...
} myStructure;

所以,我需要把它翻译成 C#:

[StructLayout(LayoutKind.Sequential)]
public unsafe struct myStructure
{
    public delegate int Func1(void* l,int* data);
    public delegate int Func2(void* l,int* data);
              ...
}

在 C# 中,我需要将此结构的函数与实际方法耦合,但我不能这样做,因为委托是强类型,我需要创建这些委托的实例,所以我决定在 C# 中稍微改变这个结构,比如这个:

    [StructLayout(LayoutKind.Sequential)]
public unsafe struct myStructure
{
    public delegate int func1(void* l,int* data);
    public delegate int func2(void* l,int* data);
              ...
    public func1 Func1;
    public func2 Func2;
             ...
}

它可以编译,但应用程序崩溃并提供此调试信息:收到此错误:托管调试助手 'PInvokeStackImbalance' 调用 PInvoke 函数 'myApp!myApp.Somenamespace::MyInterface' 使堆栈不平衡。这可能是因为托管 PInvoke 签名与非托管目标签名不匹配。检查 PInvoke 签名的调用约定和参数是否与目标非托管签名匹配。程序“[7976] myApp.exe”已退出,代码为 -1 (0xffffffff)。

一些想法,我该如何解决这个问题?

标签: c#dlldelegatesfunction-pointers

解决方案


推荐阅读