2012-12-19 33 views
0

試圖在我的C#應用​​程序中使用一些COM對象。從C#中的COM對象訪問函數/ Silverlight

1-ST變種:

using AXVLC; 

Type t = Type. 
      GetTypeFromCLSID(
      Guid.Parse("E23FE9C6-778E-49D4-B537-38FCDE4887D8") 
      ); 

AXVLC.VLCPluginClass vid = Activator.CreateInstance(t) as VLCPluginClass; 

但是,得到這樣的誤差: 互操作類型 'AXVLC.VLCPluginClass' 不能被嵌入。改爲使用適用的界面。 ComObjectCalls

我明白,COM對象不公開一個公共構造函數,那麼我將不得不找到一些其他方式使用該對象。很多時候COM對象使用工廠模式來創建對象的實例(例如iCLASS非實例= COMClass.CreateInstance();)

或者使用Activator.CreateInstance()

此外,我想有COM對象的另一個問題: - 我使用動態類型:dynamic shell = AutomationFactory.CreateObject(「WMPlayer.OCX.7」);

它創建 - 確定。但是如何知道,我可以使用哪些metods。我該如何施展它?

主要問題是:我想用Silverlight應用程序訪問COM對象。 所以有動態/ expondo對象或以P調用的工作方式/調用一些本地庫在Silverlight中,如:

[DllImport("user32.dll", CharSet = CharSet.Auto, EntryPoint = "MessageBox")] 
public static extern IntPtr MineMessageBox(int hWnd, string text, 
string caption, uint type); 

... 
MineMessageBox(0, "Hello World", "Platform Invoke Sample", 0); 

什麼是訪問Silverlight的COM對象功能的最佳方式,也可以以獲取運行時關於此COM對象的所有信息(獲取方法,我可以稱之爲等)

謝謝!

回答

1

所有COM對象符合接口,這是您的方法來自哪裏。

在VLC ActiveX控件的情況下,您很可能不會使用AXVLC.VLCPluginClass,而是使用AXVLC.VLCPlugin。這類似於Office的使用Application而不是ApplicationClass的互操作。

在你的第二個例子中,當使用dynamic時,讓你的IntelliSense工作的一種方法就是簡單地將CreateObject返回到接口。但是,在構建之前,您需要記住刪除它,否則演員陣容在運行時會失敗。

替代方法(和更好的方法)將簡單地處理該COM對象的文檔。

1

使用AutomationFactory類和dynamic關鍵字(.net 4.0/sl 4.0最低)。