2016-12-07 1 views
0

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を処理しても大丈夫です私はコピーをしたくありません。私はクラスを包むためにクラスをラップしたいだけです。

これを行うには、きれいで簡単な方法はありますか?

+0

マイナーシンタックスエラーまたは2以外の場合、コードはそのままコンパイルされて実行されます。 –

+0

@ダンあなたはこれをどのようにコンパイルしていますか?私は 'エラーC3767:候補機能がアクセスできない'を取得しました。私はVisual Studio 2015を使用しています.VSの古いバージョンでは動作しましたが、後でリリースはネイティブタイプで保護されたステータスを実装したと思います。 – user3072517

+0

VS2015アップデート#3、新しいC++/CLIコンソールアプリ。 –

答えて

0

答えは構文や使用上の問題ではありませんでした。 2つの管理対象オブジェクトは異なるDLLにあり、.NET経由で渡すことはできませんでした。同じプロジェクトでコードをコンパイルすると、問題は解決されました。

VS 2015では問題がアクセシビリティ上の問題であり、リンクフェーズで報告されていたため、リンカがNativeBの実装について知っていなかったためと思われます。 externを宣言する。 CLRに包まれて、それは別の問題として浮上した。

関連する問題