通常の 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++ オブジェクトでマネージ ポインターを使用する正しい方法は何ですか?