【问题标题】:Return unmanaged object pointer in C#在 C# 中返回非托管对象指针
【发布时间】:2011-10-03 13:23:22
【问题描述】:

我已经为本地 C++ 类编写了两个托管 C++ 包装器,我需要一个本地 B 类的非托管对象作为构造本地 A 类的托管包装器 A 的函数中的返回参数!

例子:

// Wrapper A

WrapperA::WrapperA(ClassB *classB)
{
    ClassA *classA = new ClassA(classB);
    ...
}

// native c++
ClassA::ClassA(ClassB *classB)
{
    m_classB = classB; // ClassB *m_classB; in .h
    ...
}

// Wrapper B

ClassB* WrapperB::GetNativeClassB()
{
    return m_classB; // ClassB *m_classB; in .h
}


// in C#
...
WrapperB wrapperB = new WrapperB();

unsafe // need for C++ pointer
{
WrapperA wrapperA = new WrapperA(wrapperB.GetNativeClassB() ); 
// Error: is inaccessible due to its protection level 
// -> is set to public
}
...

有没有更好的方法没有不安全以及为什么我得到一个访问错误???

提前谢谢你!

问候 leon22

【问题讨论】:

  • 您确定WrapperB::GetNativeClassBWrapperA::WrapperA 都是公开的吗?
  • Wrapper A/B 的Constr 是公开的,GetNativeClassB 也设置为公开

标签: c# pointers object unmanaged managed


【解决方案1】:
  1. 保护级别:我确定你已经定义了 public,但是包含符号的 dll 呢?你确定你有最新版本吗?

  2. 不安全:为了使用/包装不安全/本机代码作为 C++,最好的选择是使用 C++/CLI(例如托管 C++),从Visual Studio 2005 版本。只需定义一个 ref class 来包装您的本机/非托管类,该类将可以从托管代码直接访问,如 C#。从 Visual Studio 开始的提示:从 Visual C++ 部分打开一个新的 dll CLR 项目;

C++/CLI 在我看来是最好的解决方案

【讨论】:

  • 我正在使用 WrapperB 中的 classB 对象(使用 GetProcAddress 从 dll 加载),它工作正常,但将对象返回到 C# 并绕过 WrapperA 不起作用(由于保护错误)
  • 并确保包装器是用 C++/CLI 编写的
  • 我认为您没有正确编写 C++/CLI 包装器类,因为您在包装器接口 (WrapperA(ClassB *classB) ) 中使用了不安全指针,因此您需要使用不安全块。 wrapperA-> WrapperA::WrapperA(WrapperB ^classB) 的构造函数的例子。仅在包装类中使用本机指针
  • 我已经以其他方式进行了测试:将带有托管 ^ 作为参数的 WrapperB 提供给 WrapperA,然后我调用 wrapperB->GetNativeClassB() -> 错误:错误 C3767:候选函数不可访问(方法和类是公共的)我不明白这一点(包装器包含在 C# 中的每个添加引用中)
  • 好了,最后一个,希望对你有帮助。您是否已经尝试过#pragma make_public(ClassB)? msdn.microsoft.com/en-us/library/ms235607%28VS.80%29.aspx.
【解决方案2】:

解决方案来自:Pass a C++/CLI wrapper of a native type to another C++/CLI assembly

// in WrapperB
property IntPtr _classB 
{
    IntPtr get() { return IntPtr(classB); }
}

// in WrapperA
ClassB *classB = static_cast<ClassB*>(wrapperB->_classB.ToPointer());
// ... do something ...

【讨论】:

    猜你喜欢
    • 2017-08-16
    • 2019-01-08
    • 2011-07-12
    • 1970-01-01
    • 1970-01-01
    • 2011-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多