1

ソースコードがある C++/CLI dll がありますが、それを変更することはできず、メンバー変数にアクセスしたい独自の dll があります。

アセンブリ 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' で宣言されたプライベート メンバーにアクセスできません

「オブジェクト ブラウザ」には次のように表示されます。

public SomeClass* m_pPointer A のメンバー

別のアセンブリからネイティブ パブリック メンバーにアクセスする方法はありますか?

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));
4

1 に答える 1

2

既定では、すべてのネイティブ型はプライベートです (アセンブリ外の管理されたアクセシビリティに関して)。そのため、パブリックとしてリストされていても、タイプSomeClassがプライベートであるため、アクセスできなくなります。SomeClassこれは、定義の前に を付けることで変更できます (ソース コードpublicを変更できる場合)。SomeClassまたは、ソース コードを変更できないが、SomeClassその dll 内のコードを変更できる場合は、プラグマを使用できます。

#pragma make_public(SomeClass)

そうは言っても、あなたの説明に基づいて、Assembly1 をまったく変更できないように思えますが、その場合は運が悪いです。

于 2013-08-16T15:03:22.620 に答える