2013-08-16 74 views
1

訪問本地成員,我有一個C++/CLI DLL,我的源代碼,但我不能改變它,我有我自己的DLL,我想訪問一個成員變量:C++/CLI不能從不同的裝配

組件1(不能被修改):

public ref class A 
{ 
public: 
    int m_iInteger; 
    SomeClass* m_pPointer; 
}; 

組件2(自己):

A^ a; 
int i = a->m_iInteger; // no problem 
SomeClass* x = a->m_pPointer; // C2248 

存在的問題是,編譯器顯示一個錯誤:

錯誤C2248: 'A :: m_pPointer':不能訪問類 'A'

「對象瀏覽器」 顯示宣稱私有成員:

公共SomeClass的* m_pPointer一個

會員

有沒有辦法從一個不同的程序集訪問本地公衆成員?

我使用Visual Studio 2012

編輯: 類 「SomeClass的」 在本機DLL(我不能修改過)定義

編輯2: 我發現一個辦法。它不是很漂亮,但它的工作原理:

System::Reflection::Pointer^ ptr = (System::Reflection::Pointer^)typeof(A)->GetField("m_pPointer")->GetValue(a); 
SomeClass* result = static_cast<SomeClass*>(System::Reflection::Pointer::Unbox(ptr)); 
+0

這個樣本對我來說很好。我不禁想到還有一些額外的代碼導致了這一點。另外,如果你不A^a = gcnew A();你將得到一個空例外。 – Inisheer

+0

當然還有更多的代碼。這是一個大項目。我試圖簡化代碼,但我不知道哪些其他代碼會導致錯誤。我無法訪問該託管類的任何本機指針。你有什麼主意嗎? – user37337

+0

[Here](http://msdn.microsoft.com/en-us/library/tsbce2bh(v = vs.80).aspx)是該編譯器錯誤的文檔。它聽起來像是一個子類或朋友類錯了。 – stonemetal

回答

2

所有原生類型是專用默認情況下(在裝配外管理輔助功能方面)。因此,儘管它被列爲公開,但由於SomeClass類型是私有的,因此它無法訪問。您可以通過在SomeClass定義前加上public(如果您可以修改SomeClass源代碼)來更改此設置。或者,如果你不能修改SomeClass源代碼,但你可以在DLL中修改代碼,你可以使用雜注:

#pragma make_public(SomeClass) 

這就是說,根據您的描述,它聽起來就像你不能修改Assembly1在所有,在這種情況下,你運氣不好。

+1

我試過#pragma make_public(SomeClass)沒有結果,我試過#pragma make_public(A),結果爲: 錯誤C2158:'A':#pragma make_public指令當前僅支持本地非模板類型 注意:我編輯了問題 – user37337