2010-08-23 27 views
3

我有一個很老的(VC++ 5.0)專有的DLL,我需要從C#(Visual Studio 2010)中使用。該示例指定要訪問此組件,我需要調用指向OLE的CreateDispatch("application")從C#調用舊的OLE組件

下面是示例代碼(C++):

IComponentServer Server; 
Server.CreateDispatch("Component.Server"); 

我加入通過Visual Studio一個參考給TLB文件我有,我可以成功地導入其命名空間,但是IComponentServer沒有任何方法稱爲CreateDispatch

什麼是通過C#創建OLE組件實例的正確方法?

回答

3

如果您有任何的CLSID或進程id,你可以使用下面的一套方法。

var type = Type.GetTypeFromProgID(progIdString); 
var obj = Activator.CreateInstance(type); 
var server = (IComponentServer)obj; 
+0

謝謝JaredPar。 任何想法,爲什麼我可能會得到您提供的代碼InvalidCastException? 此操作失敗,因爲IIC'{BAA135B2-F931-11D0-9C14-0060973155F0}'接口的COM組件上的QueryInterface調用由於以下錯誤而失敗:沒有此類接口支持(異常來自HRESULT:0x80004002(E_NOINTERFACE ))。 – jbx 2010-08-23 18:07:30

+0

@jbx,最有可能的原因是COM組件的類型庫未正確註冊。 – JaredPar 2010-08-23 18:12:26

+0

我試圖regasm失敗,說它不是一個有效的.Net程序集(正確,所以這是一個VC++ 5.0年齡的舊庫) 我試過regtlibv12.exe,它說它成功地註冊了TLB。然而同樣的問題。任何想法我可以做什麼? – jbx 2010-08-23 20:49:26

1

MFC's CreateDispatch根據CLSID或ProgId字符串創建COM對象。您可以直接從C#代碼實例化COM對象。

假設在Visual Studio參考給你Interop.Component.dll

IComponentServer server = new Interop.Component.ServerClass(); 
+1

可能無法正常工作,MFC代碼使用了晚期綁定的IDispatch接口。在C#中執行操作並不那麼容易,除非OP使用4.0版本並可以利用* dynamic *。用VB.NET編寫的一個小適配器將是一個選項。 – 2010-08-23 17:49:34

+0

這可能是唯一的選擇 - 根據@ JaredPar的回答,類型庫看起來不太好。 – 2010-08-23 19:40:44

+0

你能解釋一下Interop軟件包從哪裏來的?有一點在這裏輸了。 – jbx 2010-08-23 20:53:43