2011-06-24 65 views
0

所以我期待在C#中播放一些音頻,並且我發現this: 基本上說參考quartz.dll並使用FilgraphManagerClass安全性修改Embed Interop Types參考設置(和一個音頻播放器)

這對我的應用程序來說是完美的,因爲我希望能夠在歌曲中的特定點處開始播放歌曲。可以通過設置FilgraphManagerClass.CurrentPosition來完成此操作。另外,我希望這首歌能夠在沒有任何特殊播放器彈出的情況下在後臺播放,這在使用此dll時會發生。

不幸的是我,當我嘗試做的例子表明,的Visual Studio 2010速成抱怨,並告訴我「的互操作類型FilgraphManagerClass不能嵌入。」我被允許使用FilgraphManager接口,但缺少CurrentPosition屬性和任何尋找能力。

This article建議找到適當的接口。但似乎並沒有真正符合FilgraphManagerClass的標準。它還簡要介紹了嵌入程序集的安全性

要使用該類,我最終右鍵單擊QuartzTypeLib參考並將設置Embed Interop Types更改爲false。現在一切都按照它應該的那樣工作。

好吧......終於我的問題:

  • 它是安全的改變Embed Interop Types設置像我一樣爲QuartzTypeLib
  • 所有COM類型都是如此嗎?
  • 這是什麼嵌入和元數據的東西,爲什麼它會安全嗎?
  • 有人可以信任的dll嗎?

回答

1

您需要忽略安全性參數,這只是無稽之談。問題是嵌入互操作類型功能要求類型與COM服務器中的接口具有一對一匹配。他們必須有一個匹配的[Guid]屬性。該屬性允許他們聲明從不同程序集加載的類型是兼容的,即使它們來自不同的程序集。 Guid上的比賽是關鍵。

對於名稱以「Class」結尾的類,這是一個問題。他們是'假'類,從真正的COM coclasses合成。它解決了.NET不支持多繼承的問題。由於它們是自動生成的,它們的[Guid]與COM類型庫中的CLSID不匹配,並且該類型不能被嵌入,因爲它們無法驗證類型等同性。

你可以經常避免多重繼承問題,只需創建一個沒有「Class」後綴的coclass實例。當然在這種情況下:

 var player = new QuartzTypeLib.FilgraphManager(); 
     player.RenderFile(@"c:\temp\test.avi"); 

編譯和運行,不玩。但這是一個不同的問題,您應該使用Windows Media Player。從COM選項卡添加引用。

禁用EIT並不是真正的問題,您只需在構建目錄中獲取需要在用戶計算機上部署的interop.dll文件。EIT的設計是爲了解決PIA(主互操作程序集)問題,因爲您沒有將本地COM接口暴露給任何其他程序集,所以這裏沒有這個問題。

+0

啊,好的。我現在看到,當我將該屬性設置爲false時,我得到一個額外的dll。另外,我認爲它不起作用,因爲你必須在文件渲染後說player.Run()。出於好奇,爲什麼你認爲我應該使用WMP?我有點希望在後臺運行一些東西,我不想篩選一大堆額外的功能。雖然從C#使用它的想法有點酷。 :-P – user420667

相關問題