c# - 调用从 C# 获取 char** 的 C dll 函数

标签 c# c

我有一个 C dll,它导出一个如下所示的函数:

void GetSectionData(TCHAR name [], char **Address, DWORD * Size)

该函数获取名称并在分配了 *Size 字节后返回地址。以下是如何在 C 中使用该函数的示例:

char *addr[64]:
DWORD Size[64];
TCHAR name[260];
sprintf( name, "myDll.dll);
GetSectionAddress(name, &addr[index],&Size[index]);

我想在 C# 中使用这个 dll 函数,但不存在不安全
我的函数声明应该使用 DllImport 属性,但我不知道如何声明参数,主要是 Address 和 Size 参数(我假设 name 可以声明为 StringBuilder):

[DllImport("myDll.dll")]
public static extern void GetSectionData(?)

最佳答案

一般来说,您的 pinvoke 签名是

static extern void GetSectionData(string name, out string address, out int size);

但是:

  • 在“adress”参数中,您可能需要通过[MarshalAs]属性和正确的SizeIndex值来指示与“size”的关系。如果您将“out string”更改为“out char[]”,那么肯定是必需的,但是如果您使用 string 并且返回的字符串是普通的以 null 结尾的字符串,我认为没有必要
  • 如果函数为address数组分配内存,您可能会遇到一些问题,因为函数的使用会假设调用者必须知道如何释放它。请参见https://stackoverflow.com/a/1932956/717732https://stackoverflow.com/a/12274007/717732 - 主要问题是实际上有很多方法来分配缓冲区(包括基于堆栈的临时数组..),并且调用者将很难猜测。尤其是 p/invoke 中使用的编码器,因为它对您的代码一无所知。

关于c# - 调用从 C# 获取 char** 的 C dll 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16892117/

相关文章:

c++ - 编译后数组和指向数组的指针之间的区别?

C#.Net 委托(delegate)

c# - Azure Web PubSub 和服务器之间的身份验证

c# - 是否有一个存储库可以抽象出 Azure、S3 等?

c - OpenGL 中的纹理映射(使用 SOIL)

C fgets 会跳过用户输入,即使在刷新缓冲区时也是如此

使用制表符的 C 输出格式

c# - 从 UserPrincipal 对象获取 nETBIOSName

c# - 给定一个定向枚举,最小的按位求逆方法是什么?

c - 交换钉跳拼图时的逻辑错误