我有一个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
修改 class“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 :(得分:2)
默认情况下,所有本机类型都是私有的(就程序集外部的托管可访问性而言)。因此,即使它被列为公共,因为类型SomeClass
是私有的,它使它无法访问。您可以通过在SomeClass
前加public
前缀来更改此项(如果您可以修改SomeClass
源代码)。或者,如果您无法修改SomeClass
源代码,但可以修改该dll中的代码,则可以使用该编译指示:
#pragma make_public(SomeClass)
那就是说,基于你的描述听起来你根本不能修改Assembly1,在这种情况下你运气不好。