将 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#代码中,你可以直接传入数组而不用担心编组。
我正在处理一个 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#代码中,你可以直接传入数组而不用担心编组。