C#コードをC++に変換する処理が進行中ですが、段階的に行う必要があります。私は現在、マネージコード内からいくつかのネイティブオブジェクトをインスタンス化する必要がある点にいます。これらのネイティブオブジェクトは、私が変更することはできません、と彼らの宣言は次のようになります。ネイティブのshared_ptrをマネージアセンブリに渡す
public class NativeA();
public class NativeB(std::shared_ptr<NativeA> obj);
NativeAとNativeB両方としてマネージコードからインスタンス化する必要が
:
void main() {
ManagedA ObjectA = gcnew ManagedA();
ManagedB ObjectB = gcnew ManagedB(ObjectA);
}
問題は、ののshared_ptrを取得でいますNativeBのコンストラクタのNativeA Niether NativeAとNativeBはマネージコードで操作されますが、インスタンス化する必要があります。理想的には、次のようなものがあります。
public ref class ManagedA {
public:
ManagedA() { _object = new NativeA(); }
~ManagedA() { delete _object; }
NativeA * Get() { return _object; }
private:
NativeA *_object;
};
public ref class ManagedB {
public:
ManagedB(ManagedA^ objectA) {
_object = new NativeB(std::make_shared<NativeA>(*objectA->Get());
}
~ManagedB() { delete _object; }
private:
NativeB *_object;
};
ただし、ネイティブタイプはプライベートとして宣言されているため、これはC++/cliでは許可されていません。 #pragma make_public(NativeA)
を定義してもこの問題は解決されません。
私の意図は、マネージコードでネイティブオブジェクトを扱うのではなく、単にインスタンス化する必要があるため、ネイティブポインターをマーシャリングして.NET GCを処理しても大丈夫です私はコピーをしたくありません。私はクラスを包むためにクラスをラップしたいだけです。
これを行うには、きれいで簡単な方法はありますか?
マイナーシンタックスエラーまたは2以外の場合、コードはそのままコンパイルされて実行されます。 –
@ダンあなたはこれをどのようにコンパイルしていますか?私は 'エラーC3767:候補機能がアクセスできない'を取得しました。私はVisual Studio 2015を使用しています.VSの古いバージョンでは動作しましたが、後でリリースはネイティブタイプで保護されたステータスを実装したと思います。 – user3072517
VS2015アップデート#3、新しいC++/CLIコンソールアプリ。 –