C ++ / CLI无法访问来自不同程序集的本机成员

时间:2013-08-16 12:55:57

标签: c++-cli

我有一个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));

1 个答案:

答案 0 :(得分:2)

默认情况下,所有本机类型都是私有的(就程序集外部的托管可访问性而言)。因此,即使它被列为公共,因为类型SomeClass是私有的,它使它无法访问。您可以通过在SomeClass前加public前缀来更改此项(如果您可以修改SomeClass源代码)。或者,如果您无法修改SomeClass源代码,但可以修改该dll中的代码,则可以使用该编译指示:

#pragma make_public(SomeClass)

那就是说,基于你的描述听起来你根本不能修改Assembly1,在这种情况下你运气不好。