2011-05-23 61 views
3

假設我有一個NativeClassInstance以下簡單的包裝。傳遞天然型的C++/CLI包裝到另一C++/CLI組件

public ref class Wrapper 
{ 
private: 
    NativeClass *_wrapped; 
public: 
    Renderer() 
    { 
     _wrapped = new NativeClass(); 
    } 
    ~Renderer() 
    { 
     delete _wrapped; 
    } 
    operator NativeClass*() 
    { 
     return _wrapped; 
    } 
} 

現在,我想與Wrapper wrapper = new Wrapper()創建C#包裝的實例,並在另一個駐留在另一組件,Helper.Foo(wrapper)(沒什麼好奇怪的具有其它功能不直接相關的包裝了本地功能的包裝用它在另一個組件類,IMO):

// Utilities is in another Assembly 
public ref class Helper 
{ 
public: 
    static Foo(Wrapper ^wrapper) 
    { 
     // Do something in native code with wrapper->_wrapped 
    } 
} 

與隱式用戶轉換的結果是:

  • 候選人功能(S)不能訪問

如果我讓_wrapped公衆是:

  • 不能訪問類中聲明私有成員...

現在,我已經據悉,原生型能見度private大會之外。那麼,我應該如何在它定義的程序集之外的本機代碼中使用包裝的實體呢?我讀過的make_public但如此看來在一般情況下非常有限,你不能用模板類型使用。我錯過了什麼嗎?有更正確的解決方案嗎?

回答

1

幫手裝配如果使用make_public您可以使用一個屬性如

property IntPtr WrappedObject { 
    IntPtr get() { return IntPtr(_wrapped); } 
} 

然後您檢索NativeObject,你解決方案包括公開的應該工作(顯然最好是建立一個公共訪問者)。關於你的評論:「我讀過的make_public,但你不能用模板類型,因此在一般情況下,似乎非常有限的使用。」我同意 - 在這裏閱讀我所用的解決方法: http://social.msdn.microsoft.com/Forums/en-US/vclanguage/thread/b43cca63-b0bf-451e-b8fe-74e9c618b8c4/

更多相關信息: Best workaround for compiler error C2158: make_public does not support native template types

祝你好運!

+0

大聲笑,我已經看到你的答案!我想有一次我應該接受這個限制及其解決方法。 – ceztko 2011-05-25 04:54:40

+0

其實,這是個不錯的解決辦法。本地wrappER類型(對本機wrappED類型)的顯式轉換運算符也可能有助於可用性。 – ceztko 2011-07-09 03:49:41

+0

在msdn網站上引用該解決方案。 「所以創建一個本地類VectorOfNativeB,並在其中存儲一個指向/ std :: vector 的指針/ ref。將這個類放入B中,並使用make_public附註將其公諸於衆。更改GetMgdClassB方法以獲取指向此本機類的指針/引用「,Mike Danes(Microsoft社區貢獻者,主持人)。 – ceztko 2011-07-09 03:53:24

2

我還沒有能夠使用make_public成功地公開本機類型,但我使用的解決方案是將NativeClass放在它自己的本機DLL中,然後a)從兩個程序集引用本機DLL;和b)的指針傳遞給周圍的天然類作爲IntPtr

在上述情況下,而不是有一個operator NativeClass*在您

static void Foo(Wrapper ^wrapper) 
{ 
    NativeObject *_wrapped 
     = static_cast<NativeObject*>(wrapper->WrappedObject.ToPointer()); 
    // ... do something ... 
} 
+0

是的,我認爲(並肯定在其他地方讀過)關於此解決方案。現在,我在你的答案中看到它看起來不那麼糟糕... – ceztko 2011-05-25 04:34:23

相關問題