2012-09-03 24 views
5

我在寫一個C#應用程序,它必須讀取視頻文件的視頻屬性。我發現要做到這一點的唯一方法是需要C++的Microsoft Media Foundation。託管的C++程序集可以將對象返回給C#嗎?

到目前爲止,我已經取得了一些進展:

  • 我創建了一個託管C++組件,其編譯成一個DLL。
  • 我可以用C#代碼中的一個參數來調用它。
  • 它執行並打印視頻文件屬性。

接下來我想做的是讓DLL返回視頻屬性(寬度,高度,持續時間等)的對象。鑑於我使用C++託管代碼,是否有一種簡單的方法來定義對象類型並使用它在C#和C++之間傳遞數據,還是必須使用Marshal類?

+0

我可能是錯的,但我認爲託管的C++對象與C#兼容。它是不是託管C++也許?如果託管C++使用非託管媒體基金會對象,只需將它們包裝在託管代碼中 – EOG

+0

「我可以用C#代碼中的參數調用它。」 - 你怎麼做到這一點? COM Interop? –

+0

要調用C++託管代碼,我添加了程序集作爲參考。接下來,我使用「using」加載了命名空間。從那時起,我可以像C#靜態類一樣訪問C++方法。 – James

回答

3

當然!如果你定義在你的管理下的公共對象++(也稱爲C++/CLI):

public ref class MyManagedClass{ 
. . . 
} 

,然後從你的C#項目中引用的DLL,你就可以使用,就像你已經定義它的對象在C#中。

+0

這個簡單的解決方案適用於我。謝謝。 – James

2

您可以通過COM InteropC++/CLI訪問C++對象/ dll。使用C++/CLI,您可以創建自己的包裝對象/類,這些對象/類可以直接在C#中使用。知道C++和C#,語法對你來說都會很熟悉(並且有很好的在線資源)。因爲你需要編寫CLI包裝器,C++/CLI可能需要更多的工作,但是會讓你的C#代碼更清晰(我認爲)。

這下面的文章應該讓你開始:Quick C++/CLI - Learn C++/CLI in less than 10 minutes

更深入的文章:http://msdn.microsoft.com/en-us/magazine/cc163852.aspx

一個代碼示例(顯示殼語法)使事情變得更加精彩,從上面借來的。 Student是你的C++類,StudentWrapper是個CLI包裝在你的C#代碼中使用:

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(); 
    } 
    } 
};