2016-09-29 10 views
1

私はUWPプロジェクトに取り組んでいます。私は、C#からC++(XAMLの上にDirectXで生成されたメッシュをレンダリングするため)の位置データの配列を送信したいです(現在、私はフロート配列をテストとして使っています)。UWPアプリケーションの配列をC#からC++/Cxのdllに送信

私はこれを試しました:Improper marshaling: C# array to a C++ unmanaged array(受け入れられた答え)。しかし、それは動作しません、私は何かが不足していると思いますが、私は何がわからない。彼が示唆したことを試してみると、私のコンパイラはC++で宣言されたCInput構造体について、それがネイティブなので不平を言うので、パブリック関数のパラメータにすることはできません。 (C#のから呼び出される関数)

は(私はその質問にコメントしているだろうが、私はまだその特権を持っていません。)

これは私のコードです:

C#で:

(D3DPanel.hで)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); 
    } 

struct CInput 
{ 
    float* array; 
}; 

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

    void CreateMesh(CInput points, int length); 
} 

誰もが私が間違ってやっているものを私に教えてもらえます?

EDIT:

hereを説明するように、私は、PassArrayパターンを試してみましたが、それは、このエラーを与える: "エラーC4400"のconst int型:このタイプでのconst/volatile修飾子はサポートされていません"

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

"const Array ^"を "Array"に置き換えると、 "syntax error:identifier 'Array'"と表示されます。

+0

私は受け入れられた答えで書かれたことをしようとしているので、構造体を使用しています。私はあなたが言っていることを正確に理解しているか分からない(実際には、私はそうではないと確信している)。あなたが話しているタイプを調べて、それをより良く理解できるかどうかを見て、新しい質問に戻ってきます。 – Stef

+0

したがって、IVectorを使用するには、IVectorから継承し、C++/CX部分のCIput構造体の代わりにそのクラスを使用する新しいrefクラスを作成する必要があります。あれは正しいですか?だから私はIVectorで定義されているすべての関数を実装する必要がありますか? – Stef

+0

Platform :: Arrayを使用しようとすると、コンパイラはそれに不平を言う。 (エラーC2061 \t構文エラー:識別子 '配列') – Stef

答えて

1

あなたはインテリセンスが示唆するように、

Platform::WriteOnlyArray<float>^ 

それはだ「アウト」タイプ、およびそれがタイプ「で」だ

const Platform::Array<float>^ 

を使用し、あなたのコードを少し変更する必要があります。 C++/CXは「イン/アウト」タイプをサポートしていません。

私はC++/CXでメモリの割り当てを行うことをお勧めします。したがって、C#コードでは、マーシャリングを気にせずに直接配列を渡すことができます。

+0

はい!私は実際に仕事の終わりに最後の金曜日を見つけました。 それは私が予想したよりも実際にはすべて簡単ですが、マーシャリングを行う必要はありません。私が見つけたPassArrayパターンがそのトリックをするように。 あなたはIntellisenseがそれを示唆していると言っていますが、Intellisenseは何も示唆していませんでしたが、C#ではなくC++/CXでしか動作しないようです。 それは、私が「プラットフォーム::」をそこに置くことを忘れた理由です(私は実現に数時間を要しました)、私はIntellisenseが私にそれを固定するのに慣れています。 :s – Stef

+0

私の驚いたことに、私はC++/CXで公開値構造体を作成し、その型をC#で直接使用することもできます。 (私の配列ですべての位置データを格納するために使用した型です)。 – Stef

関連する問題