c# - 如何将 C 数组映射和编码为 C# 代码

标签 c# c++ c

我正在编写调用 C 库的 C# 代码以及一些我不太清楚的内容。

C 函数具有此签名:

double* DoSomeStuff(double* input,int numberOfElements);

我将函数映射为:

[System.Runtime.InteropServices.DllImportAttribute("myDll.dll", EntryPoint="DoSomeStuff")]
public static extern  System.IntPtr DoSomeStuff(ref double input, int numberOfElements) ;

输入值是一个数组,因此 C 函数需要一个连续的内存布局。我对 C++ 比 C# 更熟悉。在 C++ 中,我使用 std::vector 来存储数据,然后我将使用 data() 方法获取指针并与 C 代码交换信息。 std::vector 保证连续的布局内存。

我可以在 C# 中使用哪种数据结构? C# 中有类似 std::vector 的东西吗?

我之前遇到过同样的字符串问题(在 C++ 中,std::string 只是一个 std::vector 加上一些修饰)。我已经使用以下方法解决了问题:

System.IntPtr stringExample = Marshal.StringToHGlobalAnsi("StringExample"); 

静态函数为我完成了这项工作。其他类型有类似这个功能吗?

我已经问了太多问题,我认为最重要的一个是:解决这类问题的最佳实践是什么?

谢谢

最佳答案

1)

将输入定义为 IntPtr:

[System.Runtime.InteropServices.DllImportAttribute("myDll.dll", EntryPoint="DoSomeStuff")]
public static extern  System.IntPtr DoSomeStuff(IntPtr input, int numberOfElements) ;

2)

fixed 中创建一个数组 block ,然后从指针创建一个 IntPtr,然后将其传递给 DoSomeStuff

double[] input = new double[20];
IntPtr result = IntPtr.Zero;
fixed(double* d = &input[0])
{
    result = DoSomeStuff(new InptPtr(d), 20);
}

...
fixed block 的

原因 是为了让 GC 在非托管代码填充数组时不会移动数组。

关于c# - 如何将 C 数组映射和编码为 C# 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5219995/

相关文章:

c# - 在 C# 中使用 RSA 公钥和私钥加密数据

c# - 在特定元素之前将元素添加到列表

C++ 抽象类参数错误解决方法

c - 第一个 C 程序 - 需要有关 Eclipse 的帮助

c# - 如何使用 Gmail SMTP 服务器在 C# 中发送邮件?

c# - 将对象的 linq 表达式应用于项目列表,其中该对象是项目的属性(包装器)

c++ - 官方 ld 链接器规范

c++ - 如何查找dll注册失败的原因

c - C中指针、变量和值的内存位置?

c - "Blocky"柏林噪声