【发布时间】:2017-12-09 00:14:34
【问题描述】:
我正在实现 C# 包装器以链接 C 库,并且无法将 Enum 值作为参数传递给将指针作为输入的非托管函数调用。那就是抛出这个异常。代码如下所示:
库函数:
int function(infoField Field, void const *value);
C# 中的元帅:
[DllImport("CLibrary.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
static extern int function(infoField Field, IntPtr value);
infoField 结构:
public enum infoField {section, options, orientation};
一个枚举类型“选项”有 4 个值可供选择:
public enum Options { var1, var2, var3, var4};
我想将 4 个选项之一作为 EnumField = Options 的值传递,如下所示:
IntPtr value = (Intptr)Options.var1;
function (infoField.options, value);
我认为我缺少指向 Enum 类型的指针的正确强制转换约定。将枚举值与 IntPtr 一起传递给函数的正确格式应该是什么? 到目前为止,我尝试了几个选项,但在函数调用时得到 AccessViolationException,这意味着内存分配失败或与库所期望的类型不匹配。
PS:其他 EnumFields 的函数封送处理是成功的。这也是因为值传递对他们来说是字符串值。但特别是对于“选项”,它必须是 4 个枚举选项之一。
【问题讨论】:
-
EnumField 是如何定义的?
-
@TommasoBelluzzo:我已经更新了 *infoField!
标签: c# c++ enums pinvoke marshalling