簡體   English   中英

使用 C++/CLI 將 C++ 非托管代碼 class 指針公開到 C#

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM