1

通常の C++ コードで使用できるように、C++/CLI で .Net ライブラリのネイティブ ラッパーを作成しようとしています。この例では、これがラップしようとしている C# コードであるとしましょう。

class Foo
{
    public Bar GetBar() {...}
    public string SomeProperty { get; set; }
}

class Bar
{
    public void Baz() {...}
}

私は基本的にC++/CLI(dllプロジェクト)でこれを大まかにやろうとしています:

class __declspec(dllexport) NativeFoo
{
public:
    NativeBar GetBar();
    std::string GetName();
    void SetName(const std::string &value);

private:
    Foo ^m_foo;
};

class __declspec(dllexport) NativeBar
{
    friend class NativeFoo;
public:
    void Baz();

private:
    Bar(Bar ^bar);

    Bar ^m_bar;
};

そうすれば、C++ ライブラリはこれにリンクでき、通常の C++ クラスであるかのように NativeFoo を使用できます。内部的には、NativeFoo はパラメーターを変換して実装を m_foo に渡し、管理されているものをすべてマーシャリングしてネイティブ表現に戻し、それを呼び出し元に返します...

ただし、私が直面している問題は、アンマネージド クラスのマネージド メンバーを持つことができないことです。

error C3265: cannot declare a managed 'm_bar' in an unmanaged 'NativeFoo'

同様に、NativeFoo をエクスポートできないため、NativeFoo を "ref" (マネージ クラス自体) としてマークすることはできません。

C3386: 'NativeFoo' : __declspec(dllexport)/__declspec(dllimport) cannot be applied to a managed type

C++ オブジェクトでマネージ ポインターを使用する正しい方法は何ですか?

4

1 に答える 1

9

gcrootアンマネージ型でマネージ ハンドルを宣言するために使用する必要があります。これは、dllexported であるかどうかに関係なく、アンマネージ型に必要です。

いくつかの良い情報といくつかのサンプルを含むMSDN ページがあります。

次のような結果になると思います。

class __declspec(dllexport) NativeFoo
{
public:
    NativeBar GetBar();
    std::string GetName();
    void SetName(const std::string &value);

private:
    gcroot<Foo^> m_foo;
};
于 2012-10-20T20:26:09.960 に答える