c# - 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)。
一些想法,我该如何解决这个问题?
解决方案
推荐阅读
- javascript - 是否存在 IsCallable 为假但 IsConstructor 为真的 JS 对象?
- typescript - 打字稿扩展道场类
- c++ - C ++中的赋值与构造函数
- sql - 在 Cloudera SQL 中重命名属性
- microsoft-graph-api - SkipToken 长度 - HTTP 错误 414。请求 URL 太长
- angular - Angular:使用现有构造函数在组件上创建对话框
- java - 使用 Phoenix 驱动程序首次连接到 HBase 时出错
- javascript - 如何删除具有相同ID的两个json对象
- c# - WebAPI [FromBody] 作为 EF 模型的行为就像它是不可变的
- php - 使用 PHP 创建嵌套的 JSON 对象