c# - 如何使用平台调用编码 void*

标签 c#

我需要从包含在 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/

相关文章:

c# - .NET 中应用程序域的常见用途和最佳实践?

c# - 以编程方式启动 Windows 10 表情符号热键

java - 创建运行java的cmd进程

c# - IHttpClientFactory 的解析服务在 Azure 函数上失败

C#——获取,然后比较来自 JSON 字符串的值

c# - 拦截和取消 DirectX 游戏的按键事件

c# - 使用 RNGCryptoServiceProvider 生成随机字符串

c# - 尝试在 C# 中发送邮件时出现 SMTP 异常

c# - .NET : If my . NET 自动化 Office,客户是否必须安装 Office?

c# - 如何获取 ItemDataBound 中 Repeater 中的项目计数