2009-06-19 11 views
1

私は小さなCウェブサーバーを使用しています。私は実際の要求処理のいくつかをC#ライブラリで処理しています。CコードからC#オブジェクトを作成するにはどうすればよいですか?

私は2つの世界に加わるためにC++の近くに書かれているように見える接着層を使用しています。それは私がC#の世界で派生することができる '公開refクラス'を提供します。

C#でこれからいくつかの異なるクラスを派生させたい場合、C/C++からこれらの派生クラスのインスタンスを作成するにはどうすればよいですか?

どのような情報(クラス名?ファクトリ関数ですか?)shoud私はC#からC/C++コードに(どの形式で)渡しますか?

私は、.NET 2.0と互換性のあるソリューションを希望しています。私はVisual Studio 2008を使用して自分のコードを作成しています。

+0

実行中のVisual Studioのバージョンは何ですか? – jjxtra

+0

が質問に追加されました:-) –

答えて

1

Visual Studio .NETまたはVisual Studio 2005のネイティブVisual C++コードからマネージDLLを呼び出す方法

http://support.microsoft.com/kb/828736

+0

リンクされた記事では、管理されていないコードから管理されたヒープ上にオブジェクトを作成することについて言及していません。 –

+0

この行は、オブジェクトを作成します。 //インタフェースポインタを作成します。 ICalculatorPtr pICalc(__ uuidof(ManagedClass)); –

+0

ah、fair enough –

1

C++コードにあなたのC#のアセンブリをインポートする#usingディレクティブを使用してください。

#using "ThingLib.dll" 
using namespace ThingLib; 

C++コードで基本クラスを認識したい場合は、何らかのファクトリメソッドを呼び出す必要があります。

ThingBase^ thing = myThingFactory.MakeThing(aParameter); 

あなたが実際にC++での派生クラスをインスタンス化したい場合は、gcnew演算子を使用します。 http://msdn.microsoft.com/en-us/library/xey702bw.aspx

+0

「DerivedThing」(.csファイルで宣言されている)はC++コードでどのように見えるようになりますか? –

+0

これは有用な情報だと思います;)#usingを使用してください。私は例を追加しました。 –

2

私は人々が時々マネージコードとアンマネージコードとの差の完全に認識していないことを数回を実現した:マネージコードに話のための新しいC++言語機能の良いここに要約があります

ThingBase^ thing = gcnew DerivedThing(aParameter); 

だから、要約したいと思います:

  1. ネイティブC++アプリケーションから単純にマネージコードを呼び出すことはできません。それを呼び出すには、最初に.NetコードをCOMに公開してから、C++でCOMオブジェクトをインスタンス化する必要があります。このように、ネイティブのアプリは他のCOMオブジェクトと同じようにCOMオブジェクトを作成していると考え、.Netは実行時にすべてのinteropを実行します。

  2. 第2の方法は、管理されたC++/CLI(ネイティブC++ではなく、両方の世界をサポートします)を使用することです。これにより、C++とC#の両方のアプリケーションが管理され、シームレスに通信できます。したがって、「グルー層」がマネージC++/CLIを使用して書かれている限り、ネイティブデータとマネージドデータの両方で作業できます。

あなたが最初に管理されていないC++を述べたように、その答えは第一ソリューションのために行くだろう:COM相互運用機能を通じてネイティブの世界に管理対象オブジェクトを公開します。管理対象のC++/CLIを使用しても構わない場合は、より簡単な解決策があります。管理クラスを簡単にインスタンス化することができます。

関連する問題