微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将本机类型的C ++ / CLI包装器传递给另一个C ++ / CLI程序集

如何解决将本机类型的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 举报,一经查实,本站将立刻删除。