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

标签 assemblies c++-cli wrapper native visibility

假设我有以下 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/

    相关文章:

    javascript - 包装函数包围

    dll - 使用全局程序集缓存提高速度

    c# - .NET 中 SafeBuffer 和 SafeHandleZeroOrMinusOneIsInvalid 之间的主要区别是什么?

    dll - 混合模式C++/CLI DLL在退出时引发异常

    javascript - 使用纯 JavaScript 添加 div 包装器

    c++ - OpenCV - C++ - 如何转换 cv::Scalar 以返回 cv::Scalar 的 C 包装器中的指针?

    c# - 适用于 C# 的 Google Protobuf 3.0.0 程序集

    c# - 动态加载程序集的多个版本

    c# - .NET 方法(在 .dll 中)和反射(reflect)版本之间的性能差异

    syntax - c++ 中类型后面的 ^ 是什么意思?