【发布时间】:2021-03-29 11:30:02
【问题描述】:
我正在开发一个与 C++ DLL 通信的 C# 程序。
提供的C++ DLL中的结构类型如下:
struct ST_TEST
{
unsigned long* anIDs;
unsigned long anIDCount;
};
我为匹配上述结构而创建的C#结构如下:
[StructLayout(LayoutKind.Sequential)]
public struct ST_TEST
{
public IntPtr anIDs;
public uint anIDCount;
}
在那之后,我想做的是设置 C# 结构的对象以将该结构从 C# 传递给 C++,如下所示:
uint[] IDs = { 12824874, 7865845, 45875792 };
ST_TEST stTest = new ST_TEST();
stTest.anIDCount = (uint)IDs.Length;
IntPtr buffer = Marshal.AllocHGlobal(IDs.Length);
try{
Marshal.Copy(IDs, 0, buffer, IDs.Length);
stTest.anIDs = buffer;
//... call c++ dll
}
finally
{
Marshal.FreeHGlobal(buffer);
}
如上执行时,Marshal.Copy()出现如下错误:
无法从 uint[] 转换为 int[]
如何将uint[] 作为unsigned long* 传递给C++ DLL?
【问题讨论】:
-
郑重声明,您的工作水平太低且没有适当的工具,
Span<>和stackalloc。您应该选择一个适当的低级代码,或者只使用托管数组(就像您已经分配的,您的IDs)并正确注释您的结构以按原样与编组器一起工作。 -
请解释得通俗一点。你的意思是中间创建一个clr项目比较好?
标签: c# c++ marshalling