5

ビデオファイルのビデオプロパティを読み取る必要があるC#アプリケーションを作成しています。これを行うために私が見つけた唯一の方法は、C++を必要とするMicrosoftMediaFoundationを使用することです。

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

  • DLLにコンパイルするマネージC++アセンブリを作成しました。
  • C#コードから、パラメーターを使用して呼び出すことができます。
  • ビデオファイルのプロパティを実行して印刷します。

次に実行したいのは、DLLにビデオプロパティ(幅、高さ、長さなど)のオブジェクトを返すようにすることです。C ++マネージコードを使用している場合、オブジェクトタイプを定義し、それを使用してC#とC ++の間でデータを渡す簡単な方法はありますか、それともMarshalクラスを使用する必要がありますか?

4

2 に答える 2

3

そうです!マネージC++(C ++ / CLIとも呼ばれます)でパブリックオブジェクトを定義する場合:

public ref class MyManagedClass{
. . .
}

次に、c#プロジェクトからdllを参照すると、c#で定義したのと同じようにオブジェクトを使用できるようになります。

于 2012-09-03T21:50:33.413 に答える
2

C ++オブジェクト/dllには、 COM相互運用機能またはによってアクセスできますC++/CLI。を使用C++/CLIして、C#で直接使用できる独自のラッパーオブジェクト/クラスを作成できます。C ++とC#の両方を知っていると、構文はある程度馴染みのあるものになります(そして、オンラインには優れたリソースがあります)。

C ++ / CLIは、CLIラッパーを作成する必要があるため、もう少し作業が必要になる場合がありますが、C#コードで物事をより明確に保つことができます(私の意見)。

この次の記事で始めることができます:クイックC ++/CLI-10分未満でC++/CLIを学ぶ

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

上から借用した、物事をよりエキサイティングにするためのコード例(構文を大文字で表示)。StudentはC++クラスでStudentWrapperあり、C#コードで使用されるCLIラッパーです。

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();
    }
  }
};
于 2012-09-03T21:49:51.527 に答える