2012-09-03 16 views
5

私はビデオファイルのビデオプロパティを読み取る必要があるC#アプリケーションを作成しています。私がこれを行うために見つけた唯一の方法は、C++を必要とするMicrosoft Media Foundationです。私はDLLにコンパイルマネージドC++アセンブリを作成しましたマネージC++アセンブリはオブジェクトをC#に返すことはできますか?

  • これまでのところ、私はいくつかの進歩を遂げてきました。

  • 私はそれをC#コードからパラメータで呼び出すことができます。
  • ビデオファイルのプロパティを実行して出力します。

私が次にやりたいことは、ビデオプロパティ(幅、高さ、継続時間など)のオブジェクトをDLLに返させることです。私はC++のマネージコードを使用しているので、オブジェクト型を定義してC#とC++の間でデータを渡すための簡単な方法があるのですか、またはMarshalクラスを使用する必要がありますか?

+0

私は間違っているかもしれませんが、私は管理されたC++オブジェクトがC#と互換性があると思います。おそらくそれは管理されていないC + +ですか?マネージドC++がマネージドコード – EOG

+0

でラップするだけで、管理されていないメディア基金オブジェクトを使用する場合は、「C#コードからパラメータで呼び出すことができます」 - これどうやってやるの? COM Interop? –

+0

C++マネージコードを呼び出すために、アセンブリを参照として追加しました。次に、 "using"という名前空間をロードしました。その点から、私はC++静的クラスのようにC++メソッドにアクセスできます。 – James

答えて

3

StudentはあなたのC++クラス、StudentWrapperがあなたのC#コードで使用する第CLIラッパーです!あなたが管理C++(また、C++/CLIと呼ばれる)の公共のオブジェクト定義した場合:

public ref class MyManagedClass{ 
. . . 
} 

をして、あなたのC#プロジェクトからDLLを参照し、あなたはそれを定義していただけのようなオブジェクトを使用することができますC#で。

+0

この簡単な解決策は私には役に立ちます。ありがとうございました。 – James

2

COM InteropまたはC++/CLIのいずれかでC++オブジェクト/ dllにアクセスできます。 C++/CLIを使用すると、C#で直接使用できる独自のラッパーオブジェクト/クラスを作成できます。 C++とC#の両方を知っていれば、文法はいくらかおなじみです(またオンラインで良いリソースがあります)。

C++/CLIでは、CLIラッパーを記述する必要があるため、もう少し作業が必要になることがありますが、C#コードではわかりやすいものになります。

この次の記事では、あなたが始める必要があります:Quick C++/CLI - Learn C++/CLI in less than 10 minutes

より詳細な記事:http://msdn.microsoft.com/en-us/magazine/cc163852.aspx

コード例(ショー構文ケーシング)上から借りた、物事をよりエキサイティングにします。確かに

public ref class StudentWrapper 
{ 
private: 
    Student *_stu; 
public: 
    StudentWrapper(String ^fullname, double gpa) 
    { 
    _stu = new Student((char *) 
      System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(
      fullname).ToPointer(), 
     gpa); 
    } 
    ~StudentWrapper() 
    { 
    delete _stu; 
    _stu = 0; 
    } 

    property String ^Name 
    { 
    String ^get() 
    { 
     return gcnew String(_stu->getName()); 
    } 
    } 
    property double Gpa 
    { 
    double get() 
    { 
     return _stu->getGpa(); 
    } 
    } 
}; 
関連する問題