我需要从包含在 dll 中的 C api 调用一个函数。函数原型(prototype)如下....
int func( char* name, void* value );
其中指针值的内容可以引用依赖于传递的名称的任何类型。我不确定如何设置 Dll 输入以正确编码此 void *。我一直在试验 IntPtr,当值为 int 时它似乎可以工作,但我无法正确检索 float 等的值。
我正在尝试像这样导入函数...
[DllImport("dllname.dll", CharSet = CharSet.Ansi)]
public static extern int func( string name, ref IntPtr value );
请注意,值是一个输出。指向任何类型的值的指针,即已知类型(调用者已知)的值在全局内存区域中的地址。在 c 程序中,调用者将被期望将此 void * 转换为所需的类型并取消引用以获取存储在那里的实际值。到目前为止给出的答案似乎是基于一个假设,即函数会将结果写入传入的指针位置。我的错,因为我没有说得太具体。对不起。 C# 不是我的包,我什至不知道 IntPtr 是否是去这里的路......
最佳答案
解决此问题的最佳方法是提供函数重载,以便在 C# 端一切都干净利落。像这样:
[DllImport("dllname.dll", CharSet = CharSet.Ansi)]
public static extern int func(string name, out int value);
[DllImport("dllname.dll", CharSet = CharSet.Ansi)]
public static extern int func(string name, out float value);
// etc, one each for each type
关于c# - 如何使用平台调用编码 void*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3854631/