将 UWP 应用程序中的数组从 C# 发送到 C++/Cx dll

Sending an array in a UWP app from C# to a C++/Cx dll

我正在处理一个 UWP 项目。我想从 C# 发送一个位置数据数组(目前我只是将一个浮点数组作为测试)发送到 C++(以便在 XAML 东西之上渲染 DirectX 中生成的网格)。

我试过这个:Improper marshaling: C# array to a C++ unmanaged array(接受的答案)。但它不起作用,我猜我错过了什么,但我不知道是什么。当我尝试他的建议时,我的编译器抱怨在 C++ 中声明的 CInput 结构,因为它是本机的,所以它不能作为 public 函数中的参数。 (从 c# 调用的函数)

(我会评论那个问题,但我还没有那个特权。)

这是我的代码:

在 C# 中:

public struct CInput
{
    public IntPtr array;
}

public VideoView()
{
    InitializeComponent();
    Loaded += OnLoaded;

    float[] test = new float[4];
    CInput input = new CInput();
    input.array = Marshal.AllocHGlobal(Marshal.SizeOf<float>() * test.Length);
    Marshal.Copy(test, 0, input.array, test.Length);
    D3DPanel.CreateMesh(out input, test.Length);
    Marshal.FreeHGlobal(input.array);
}

在 C++ 中(在 D3DPanel.h 中):

struct CInput
{
    float* array;
};

[Windows::Foundation::Metadata::WebHostHidden]
public ref class D3DPanel sealed : public Track3DComponent::DirectXPanelBase
{
public:
    D3DPanel();

    void CreateMesh(CInput points, int length);
}

谁能告诉我我做错了什么?

编辑:

我尝试了 PassArray 模式,如 here 所述,但出现此错误:"Error C4400 'const int': const/volatile qualifiers on this type are not supported"

void CreateMesh(const Array<float>^ points, int length);

将 "const Array^" 替换为 "Array" 得到 "syntax error: identifier 'Array'".

您需要稍微修改一下代码,按照 IntelliSense 的建议,使用

Platform::WriteOnlyArray<float>^

当它是"out"类型时,并且

const Platform::Array<float>^

当它是 "in" 类型时。 由于 C++/CX 不支持 "in/out" 类型。

我建议你在C++/CX中做内存分配,这样在你的C#代码中,你可以直接传入数组而不用担心编组。