2012-05-14 12 views
3

私は、多数のクラスをラップするC++/CLIプロジェクトを持っています。クラスは独自のメタデータシステムを持っています。ですから、私はC#でいくつかのユースケースを簡単にするための動的オブジェクトを返したいと思います。しかし、私はC++でこれを行う方法を見ていません。C++/CLIの動的オブジェクトをC#に返す

C#では、私は次のように記述することができます。

dynamic TestThisOut() 
{ 
    return null; 
} 

void mork() 
{ 
    var d = TestThisOut(); 
    d.Fork(); 
} 

私は上記の「モーク」機能でそうであるように、私はまったく同じようにそれを使用することができるように、C++/CLIでTestThisOut()を書きたいです(つまり、動的キーワードを入力する必要はありません)。これは可能ですか?

答えて

4

あなたはできます。は、C++/cliで動的オブジェクトを作成しますが、C#プロジェクトと同じように消費することはできません。しかし、あなたはC#からそれを消費することができます。

C++/CLIでは、オブジェクト^を返すプロパティまたはメソッドを作成します。 System :: Runtime :: CompilerServices :: DynamicAttributeでこのプロパティまたはメソッドをマークします。準備できた。

は、ここで私が作成した迅速なサンプルです:

namespace ClassLibrary1 
{ 
    using namespace System; 
    using namespace System::Dynamic; 

    public ref class Class1 : public DynamicObject 
    { 
    public: 
     [System::Runtime::CompilerServices::Dynamic] 
     static property Object^ Global 
     { 
     public: 
      Object^ get() 
      { 
       return gcnew Class1(); 
      } 
     } 

    public: 
     String^ Test() 
     { 
      return "Test"; 
     } 
    }; 
} 

そして、私のC#の消費者:

Console.WriteLine(ClassLibrary1.Class1.Global.Test()); 
+0

その属性はまさに私が探していたものでした。どうもありがとう! – Gordon

2

dyanmicは、C#4.0のキーワードです。 C++ CLI(およびVB.NET)ではサポートされていません。

動的オブジェクトをC++ CLIで使用する場合は、impromptu-interfaceライブラリを使用できます。 List of supported options。情報はthis question

+0

ありがとう!私はこの質問を調べていたときにその質問を見ました。残念ながら、それは私が欲しいものではありません - 私はC + +/CLIで動的オブジェクトを消費したくない - 私は1つを作成したい。私はC#の "動的"キーワードが実際にはC++/CLIで適用できるコードの属性になることを期待していたので、C#で動的キーワードを再度入力する必要はありません。 – Gordon

+0

動的キーワードはC#sugarです。その背後にある仕組みは、CLR言語から完全にサポートされています。静的な型指定なしでメンバーにアクセスする便利な方法は、C#コンパイラの砂糖です。生成される実際のコードは複雑で、どの.NET Decompilerでも見ることができます。 –