2011-08-16 69 views
2

我有一個具有以下定義的非託管代碼,
從C++ CLI傳遞結構向非託管代碼

void Load(const somestruct& structinst) 
    { 
      //dosomething. 
    } 

我想從CLI的結構在非託管代碼傳遞給此方法作爲參考,並得到在CLI中返回結構。

我試圖創造一個CLI作爲結構

[StructLayout(LayoutKind::Sequential, CharSet = CharSet::Ansi, Pack = 2)] 
ref struct TEST 
    { 
     [MarshalAs(UnmanagedType::SysInt)] 
     int k; 
    }; 

,並試圖傳遞結構作爲

CLIWrapperClass::WrapperMethod() 
{ 
    TEST test; 
    this->NativeClassInstance->Load(test); 
} 

和我越來越喜歡error C2664: 'NativeClass::Load' : cannot convert parameter 1 from 'Namespace::WrapperClass::TEST' to 'NativeClass::somestruct&'

錯誤我將如何實現這一目標?

+0

有很多*錯誤的東西。 ref結構是託管代碼中的一個類。您不使用C++/CLI中的編組屬性,該語言旨在處理該問題。但真正的問題是,你只是聲明瞭一個與非託管類型不同的託管類型。編譯器不喜歡那樣。寫一個真正的包裝。 –

回答

0

如果您需要觸摸C#中的TEST結構,請確保somestructTEST結構具有相同大小的相同基元類型的相同成員。

如果不是,爲什麼還要用StructLayout?隨便去用C使用somestruct本身++/CLI喜歡:

CLIWrapperClass::WrapperMethod() 
{ 
    somestruct test; 
    this->NativeClassInstance->Load(test); 
} 
+0

爲什麼要投票?哪裏不對? –

+0

我沒有downvote,但是'*'ref struct TEST'語句在C#中不被識別,它是無效的。*「是錯誤的。 'ref struct'只是一個託管引用類型,默認情況下具有public(而不是private)成員; C#認爲它絕對沒有不同於聲明爲「ref class」的託管引用類型 - 實際上,它們編譯爲完全相同的IL。 – ildjarn

+0

@ildjarn:已更正。謝謝。 –

0

本地代碼不兼容.NET類型可以被垃圾收集器移動的聲音。可以使用固定和投射,但這是脆弱的。更好的辦法就是將數據從託管類型複製到本地結構的實例並再次返回。

相關問題