gpt4 book ai didi

c# - 将数据从非托管代码传递到托管代码

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:16:48 27 4
gpt4 key购买 nike

我有一个三层应用程序:

  1. 托管 C# 层。
  2. 托管的 c++/cli 层。
  3. 非托管 C++ 层。

第二层作为c#和native c++的通信层。

public class ManagedResult
{
public float[] firstArray;
public float[] secondArray;
}

和非托管类

 class UnmanagedResult
{
public:
float* firstArray, secondArray;
int arrayLength;
UnmanagedResult(){};
~UnmanagedResult(){};
}

我在第二层有一个输出托管对象的类的以下方法:

 ManagedResult^ CLIContext::GetResults(){

ManagedResult^ primitiveResult = gcnew ManagedResult();

pin_ptr<int> pFirst = &(primitiveResult->firstArray[0]);
pin_ptr<float> pSecond = &(primitiveResult->secondArray[0]);
UnmanagedResult result =UnmanagedResult();
result.firstArray = pFirst;
result.secondArray = pSecond;

_context->GetResults(result);

return primitiveResult;

}

这里的 _context 是一个非托管类类型的对象,它操作一个 UnmanagedResult 类型的对象并影响它的内容。

这个解决方案工作正常。但我希望能够通过引用传递对象并使用第三方 API 来分配和填充两个成员 firstArraysecondArray。如何将数据从非托管结果传输回 primitiveResult?

最佳答案

由于非托管数组只是指向其第一项的指针,因此您需要知道项数。

如果你想要一个托管数组,你必须创建一个并将数据复制到那里。您将无法创建指向现有非托管内存的托管数组。

使用System::Runtime::InteropServices::Marshal::Copy为此:

UnmanagedResult unmanagedResult = GetTheUnmanagedResultSomehow();
ManagedResult^ managedResult = gcnew ManagedResult();

managedResult->firstArray = gcnew array<float>(unmanagedResult.arrayLength);
Marshal::Copy(IntPtr(unmanagedResult.firstArray), managedResult->firstArray, 0, managedResult->firstArray->Length);

// Do the same for secondArray

关于c# - 将数据从非托管代码传递到托管代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30064439/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com