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:

#pragma make_public(SomeClass)

也就是说,根据您的描述,听起来您根本无法修改 Assembly1,在这种情况下您不走运。

于 2013-08-16T15:03:22.620 回答