2016-09-29 61 views
1

我正在處理一個UWP項目。我想從C#發送一組位置數據(目前我只是將一個浮點數組作爲一個測試)從C到C++(爲了在DirectX中生成一個生成的網格在XAML的基礎上)。發送UWP應用程序中的數組從C#到C++/Cx dll

我試過這個: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的':常量/不支持這種類型的易失性限定符」

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

用「Array」替換「const Array ^」會給出「語法錯誤:標識符'Array'」。

+0

我正在使用一個結構,因爲我只是想要做什麼被寫入接受的答案。我不知道我確切地理解你在說什麼(實際上,我相信我不知道)。我會查找你正在談論的類型,看看我能否更好地理解它,並回過頭來提出新的問題。 – Stef

+0

因此,要使用IVector,我需要製作一個新的從IVector繼承的ref類,並使用它代替C++/CX部分中的CIput結構。那是對的嗎?所以我需要實現在IVector中定義的所有函數? – Stef

+0

當我嘗試使用Platform :: Array時,編譯器會抱怨它。 (錯誤C2061 \t語法錯誤:identifier'Array') – Stef

回答

1

你需要修改你的代碼一點點,如智能感知表明,使用

Platform::WriteOnlyArray<float>^ 

當它的「出」型,並

const Platform::Array<float>^ 

當它「在」類型。 由於C++/CX不支持「輸入/輸出」類型。

我建議你在C++/CX中做內存分配,所以在你的C#代碼中,你可以直接傳入一個數組而不用擔心編組。

+0

是的!我實際上在工作日結束時發現了最後一個星期五。 原來,這一切都比我想象的要簡單,我甚至不需要做任何編組。所以我發現的PassArray模式確實有效。 你說Intellisense暗示,但我的Intellisense沒有提出任何事情,它似乎只能在C#中工作,而不是在C++/CX中工作。 這就是爲什麼我忘記把那個「Platform ::」放在那裏的原因(我花了幾個小時才意識到,urgh),我習慣了Intellisense爲我修復這個問題。 :s – Stef

+0

令我驚訝的是,我甚至可以在C++/CX中創建一個公共值結構,並直接在C#中使用該類型! (這是我在陣列中用於存儲所有位置數據的類型。) – Stef

相關問題