【问题标题】:Sending an array in a UWP app from C# to a C++/Cx dll将 UWP 应用程序中的数组从 C# 发送到 C++/Cx dll
【发布时间】:2017-02-07 22:47:52
【问题描述】:

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

我试过这个:Improper marshaling: C# array to a C++ unmanaged array(接受的答案)。但它不起作用,我猜我错过了一些东西,但我不知道是什么。当我尝试他的建议时,我的编译器抱怨在 C++ 中声明的 CInput 结构,因为它是本机的,因此它不能是公共函数中的参数。 (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 所述,但它给出了以下错误:“错误 C4400 'const int': 不支持此类型的 const/volatile 限定符”

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

用“Array”替换“const Array^”会得到“语法错误:标识符'Array'”。

【问题讨论】:

  • 我正在使用结构,因为我只是在尝试执行已接受的答案中所写的内容。我不确定我是否完全理解你在说什么(实际上,我确定我不明白)。我会查找您所说的类型,看看我是否能更好地理解它,然后再提出新问题。
  • 因此,要使用 IVector,我需要创建一个从 IVector 继承的新 ref 类,并使用它来代替 C++/CX 部分中的 CIput 结构。那是对的吗?所以我需要实现IVector中定义的所有功能?
  • 当我尝试使用 Platform::Array 时,编译器会抱怨它。 (错误 C2061 语法错误:标识符“数组”)
  • 我尝试了 PassArray 模式,如下所述:msdn.microsoft.com/en-us/library/windows/apps/hh700131.aspx 但它给出了这个错误:“错误 C4400 'const int': 不支持这种类型的 const/volatile 限定符”
  • 等等,原来的评论发到了吗? (我在这里的第一条评论中回复的那个)

标签: c# uwp marshalling c++-cx


【解决方案1】:

你需要稍微修改你的代码,就像 IntelliSense 建议的那样,使用

Platform::WriteOnlyArray<float>^

当它是“out”类型时,并且

const Platform::Array<float>^

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

我建议你在 C++/CX 中进行内存分配,所以在你的 C# 代码中,你可以直接传入一个数组,而不用担心 Marshalling。

【讨论】:

  • 是的!我实际上是在上周五工作日结束时发现的。事实证明这一切实际上比我预期的要简单,我什至不需要做任何编组。所以我发现的 PassArray 模式确实可以解决问题。您说 Intellisense 建议这样做,但我的 Intellisense 没有提出任何建议,它似乎只适用于 c#,而不适用于 C++/CX。这就是为什么我忘记把“Platform::”放在那里的原因(我花了好几个小时才意识到,呃),我已经习惯了 Intellisense 为我解决这个问题。 :s
  • 令我惊讶的是,我什至可以在 C++/CX 中创建一个公共值结构,然后直接在 C# 中使用该类型! (这是我在数组中用来存储所有位置数据的类型。)
猜你喜欢
  • 2019-03-04
  • 1970-01-01
  • 2019-10-06
  • 1970-01-01
  • 2018-12-15
  • 1970-01-01
  • 1970-01-01
  • 2011-02-14
  • 2016-01-29
相关资源
最近更新 更多