如何将 unsigned long * params 转换为 ulong[] params

How to convert unsigned long * params to ulong[] params

我有一个非托管代码,它是一种类型:

unsigned long *inputParameters

我需要将我的变量输入参数转换为 C# 类型

 ulong[] inputParameters

我尝试过不同类型的转化,例如

auto inputParams = *((unsigned long*)inputParameters)
&inputParameters

但是我遇到了这个异常:

cannot convert argument from 'unsigned long *' to 'cli::array<unsigned __int64,1> ^'

任何在 C# 中称为引用类型的类型都需要使用 gcnew 关键字进行实例化,数组也不例外。大多数值类型都在幕后编排,因此您通常可以将 managed 分配给 unmanged ,反之亦然,而无需任何转换或欺骗。魔术,我知道!有一些例外,但如果有问题,编译器会通知您。

我假设 *inputParameters 是一个指针列表(而不是指向单个值的指针),这意味着您应该有一个包含列表中元素数量的变量,让我们称之为nElements。要进行转换,您可以执行以下操作:

//some test data
int nElements = 10;
unsigned long *inputParameters = (unsigned long *)malloc(sizeof(unsigned long) * nElements);

for (int i = 0; i < nElements; i++)
{
  *(inputParameters + i) = i * 2;//just arbitrary values
}

//now create a .NET array (lines below directly solve your question)
array<UInt64, 1>^ managedArray = gcnew array<UInt64, 1>(nElements);
for (int i = 0; i < nElements; i++)
{
  tempArray[i] = *(inputParameters + i);//this will be marshalled under the hood correctly. 
}
//now the array is ready to be consumed by C# code.

这里,array<UInt64, 1>^ 是 C# 的 ulong[] 的 C++/CLI 等价物。您可以 return managedArray 到 C# 的方法调用,它期望 ulong[] 作为 return 类型。