[英]Exposing C++ unmanaged code class pointers to C# with C++/CLI
為我非常基本的 C++/CLI 知識道歉,但它只是最近才被介紹給我,作為必需品。 我正在嘗試使用 C++/CLI 為非托管 C++ 庫創建一個包裝器。 我遵循了這個有用的指南,並且可以確認它(以某種方式)可以解決問題。 我遇到的問題是 C++ 指針公開了對非托管庫中公共類的訪問。 在我的 CPP 庫中,我使用它們通過訪問單個入口點 class 來調用多個類的方法。 在 C# 中,我無法訪問應該通過這些 class 指針訪問的方法。 我收到一條錯誤消息,指出“該成員由於其保護級別而無法訪問”,並且“->”指針未授予對暴露的 class成員的訪問權限。
這是我的代碼的樣子:
UnmanagedCode::ClassA
...
// some code
...
public:
void doSomething() { ... };
ClassB* classB() { return classB.get(); };
private:
std::unique_ptr<ClassB> classB_ {};
C++/CLI 包裝器
public ref class WrapperClass: public ManagedObject<UnmanagedCode::ClassA>
{
public:
WrapperClass() : ManagedObject(new UnmanagedCode::ClassA) {}; // template class code in the hyperlink
~WrapperClass() {};
void doSomething() { m_Instance->doSomething(); };
UnmanagedCode::ClassB* classB() { return m_Instance->classB(); };
};
C#程序
class Program
{
static void Main(string[] args)
{
WrapperClass w = new WrapperClass();
w.doSomething(); // this works fine
w.classB(); // here is where I am getting the error
}
}
我的 C# 知識,不如我的 C++ 好,只是作為一個注釋。 我不太明白你在這里做什么:
UnmanagedCode::ClassB* classB() { return m_Instance->classB(); };
此行返回指向 ClassB object 的指針,您可以在 C# 中檢索該指針。 據我所知,這將要求 ClassB 也是托管 object,否則,我認為您不能在 object 上調用函數,而無需為不安全的 ZC1C425268E68385D1AB4ZZZC17A94F 指針創建委托。
如果我正確理解您的問題,我認為這樣的事情會解決您的問題,在 C++ 中:
void* classB() { return static_cast<void*>(m_Instance->classB()); };
void doSomethingWithClassB(void* instance) {static_cast<ClassB*>(instance)->doSomethingWithClassB();}
然后在 C# 中:
class Program
{
static void Main(string[] args)
{
WrapperClass w = new WrapperClass();
w.doSomething();
unsafe
{
void* classb = w.classB();
w.doSomethingWithClassB(classb);
}
}
我認為您需要為每個 class 提供一個包裝器,以使其在 c# 中有用。
即返回 classB 你會寫類似
MyClassBWrapper^ GetClassB(){ return gcnew MyClassBWrapper(m_Instance->classB());
雖然您可以在托管代碼中處理指針,但它需要不安全的代碼,並且使用起來非常麻煩。 如果你正在編寫一個 c++/cli 包裝器,你應該提供一個完全托管的 API。 除了(可選地)對圖像或類似的大數據塊使用指針之外。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.