如何解决将本机类型的C ++ / CLI包装器传递给另一个C ++ / CLI程序集
| 假设我有以下NativeClassInstance的简单包装。public ref class Wrapper
{
private:
NativeClass *_wrapped;
public:
Renderer()
{
_wrapped = new NativeClass();
}
~Renderer()
{
delete _wrapped;
}
operator NativeClass*()
{
return _wrapped;
}
}
现在,我想使用Wrapper wrapper = new Wrapper()
从C#创建一个Wrapper实例,并将其用于驻留在另一个带有that2ѭ的程序集中的本机功能包装中(具有与其他程序包装中的包装类没有直接关系的其他功能,这并不奇怪):
// Utilities is in another Assembly
public ref class Helper
{
public:
static Foo(Wrapper ^wrapper)
{
// Do something in native code with wrapper->_wrapped
}
}
隐式用户转换的结果是:
候选功能无法访问
如果我公开_wrapped,它是:
无法访问在类中声明的私人成员...
现在,我了解到本机类型可见性在程序集外部是私有的。那么,如何在定义的程序集之外的本机代码中使用包装的实体?我已经读过make_public,但是您不能与模板类型一起使用,因此在一般情况下看起来非常有限。我想念什么吗?有没有更正确的解决方案?
解决方法
如果使用make_public,则将_wrapped设为公开的解决方案应该可以工作(显然最好改为设置公共访问器)。关于您的评论\“我已经读过make_public,但是您不能使用模板类型,因此在一般情况下看起来非常有局限性。\”我同意-请在此处阅读我的解决方法:
http://social.msdn.microsoft.com/Forums/zh-CN/vclanguage/thread/b43cca63-b0bf-451e-b8fe-74e9c618b8c4/
更多相关信息:
编译器错误C2158的最佳解决方法:make_public不支持本机模板类型
祝好运!
,我无法使用
make_public
成功公开本机类型,但是我使用的解决方案是将NativeClass
放入其自己的本机DLL中,然后a)从两个程序集中引用本机DLL; b)将指针作为“ 6”传递给本机类。
在上述情况下,您可以使用诸如
property IntPtr WrappedObject {
IntPtr get() { return IntPtr(_wrapped); }
}
然后,您可以通过以下方式在助手程序集中检索“ 9”
static void Foo(Wrapper ^wrapper)
{
NativeObject *_wrapped
= static_cast<NativeObject*>(wrapper->WrappedObject.ToPointer());
// ... do something ...
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。