如何将无符号长*params转换为ulong[]params

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

本文关键字:params 转换 ulong 无符号      更新时间:2023-10-16

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

unsigned long *inputParameters

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

ulong[] inputParameters

我尝试过不同类型的转换,比如

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

然而,我得到了这个例外:

无法将参数从"unsigned long*"转换为"cli::array<无符号__int64,1>^'

C#中已知为引用类型的任何类型都需要使用gcnew关键字进行实例化,数组也不例外。大多数价值类型都是在幕后被掠夺的,所以你通常可以在没有任何选角或欺骗的情况下,将管理者分配给未管理者,反之亦然。魔术,我知道!有一些例外,但编译器会让您知道是否存在问题。

我假设*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等价物。您可以将managedArray返回到来自C#的方法调用,该方法调用需要ulong[]作为返回类型。