2012-03-30 5 views
3

ネイティブのアンマネージドコードとしてコンパイルされた大きなC++プロジェクトがあります。マネージコードの機能を使用する必要がありますが、/ clrでプロジェクト全体をコンパイルしたくありません。アンマネージド使用のためのマネージコードのラップ

エクスポートされたネイティブクラスAで公開されているBという名前のrefクラスがあります。問題はC1190を取得しました。管理対象のコードにはvcclr.hインクルードのために '/ clr'オプションが必要です。

アンマネージドメソッド内でマネージコードを持つようなインターフェイスを作成する方法があるかどうかを知りたいと思います。

#pragma once 
#include "EX_Port.h" 
#include <vcclr.h> 

ref class B; 

class EX_API A 
{ 
    public: 
     A();   
     int DeviceCount(); 

    private: 
     gcroot<B^> _device; 
}; 

が、私はそれがCPP内Bクラスをgcnewで動作させるための管理:

は、ここに私のコードです。しかし、私はローカルオブジェクトを持っていますが、私はそれをグローバルスコープに入れたいと思っています。私はちょうどCLIプログラミングを始めましたので、私はいくつかの習慣を認識していないかもしれません。

おかげ

+0

マネージドクラス用のアンマネージインターフェイスを持つC++/cliライブラリを作成する –

答えて

6

あなたのビッグC++のプログラムは、任意のマネージコードを実行する前に、CLRをロードして初期化するために持っているとしています。最も柔軟性から少なくともにランク付けされ、これを行うには、いくつかの方法があります:

  • それが明示的にCLRをロードし、任意のマネージコードを実行するCLRのホスティングインターフェースを使用することができます。そのための基本的なスターターはMSDN pageで、CodeProject.comのようなサイトで多くの例が見つかります。

  • マネージクラス[ComVisible]を作成できます。 C++コードでは、標準のCOMプログラミング技術を使用して、マネージクラスのインスタンスを作成し、メソッド(CoInitializeExおよびCoCreateInstance、#importディレクティブ)を呼び出すことができます。 COM配管により、CLRが自動的にロードされ、適切なアセンブリがロードされます。これを管理するための追加コードは必要ありません。既にCOMに投資している場合は、このオプションを検討してください。そうしないと、COMの実用的な知識がない場合には考慮する必要はありません。

  • 上記の2つの手法では、C++/CLIコードだけでなく、あらゆる種類の管理コードを実行できます。 C++/CLIに特化して、自由な関数を記述し、その関数に__declspec(dllexport)属性を適用することができます。コンパイラは、LoadLibrary + GetProcAddressを使用してC++コードから呼び出すことができるように、関数をエクスポートするスタブを生成します。スタブはCLRを自動的にロードします。これは非常に簡単ですが、クラスではなく単純な関数を公開するだけなので、かなり柔軟性がありません。