我有一个 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/717732或https://stackoverflow.com/a/12274007/717732 - 主要问题是实际上有很多方法来分配缓冲区(包括基于堆栈的临时数组..),并且调用者将很难猜测。尤其是 p/invoke 中使用的编码器,因为它对您的代码一无所知。
关于c# - 调用从 C# 获取 char** 的 C dll 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16892117/