gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 02:49:15 26 4
gpt4 key购买 nike

假设我有以下 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 实例。并在位于 中的另一个 native 功能包装器中使用它另一个Helper.Foo(wrapper) 组装(没有什么奇怪的其他功能与另一个程序集中的包装类不直接相关,IMO):
// Utilities is in another Assembly
public ref class Helper
{
public:
static Foo(Wrapper ^wrapper)
{
// Do something in native code with wrapper->_wrapped
}
}

隐式用户转换的结果是:
  • 候选函数不可访问

  • 如果我公开 _wrapped 它是:
  • 无法访问在类中声明的私有(private)成员...

  • 现在,我了解到 native 类型可见性是 private在大会之外。那么,我应该如何在它定义的程序集之外的 native 代码中使用包装的实体?我读过 make_public但是您不能与模板类型一起使用,因此在一般情况下它似乎非常有限。我错过了什么吗?有没有更正确的解决方案?

    最佳答案

    我无法使用 make_public 成功公开 native 类型,但是我使用的解决方案是将 NativeClass在它自己的 native DLL 中,然后 a) 从两个程序集中引用 native DLL; b) 将指向本地类的指针作为 IntPtr 传递.

    在上述情况下,而不是 operator NativeClass*您可能会使用一个属性,例如

    property IntPtr WrappedObject {
    IntPtr get() { return IntPtr(_wrapped); }
    }

    然后检索 NativeObject在你的助手组装中
    static void Foo(Wrapper ^wrapper)
    {
    NativeObject *_wrapped
    = static_cast<NativeObject*>(wrapper->WrappedObject.ToPointer());
    // ... do something ...
    }

    关于assemblies - 将 native 类型的 C++/CLI 包装器传递给另一个 C++/CLI 程序集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6102566/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com