2017-02-09 120 views
0

我正在點擊我理解的牆。我有一個簡單的COM服務器,我想實例化。我可以簡單的VBS這樣做或PS命令我EXE外:.NET進程無法創建ActiveX對象

$sms_client = New-Object -COM 'CPApplet.CPAppletMgr' 

Set controlPanelAppletManager = CreateObject("CPApplet.CPAppletMgr") 

在我的C#代碼我試過早期綁定,後期綁定,一個PS運行空間/管道,最後的Process.Start(CSCRIPT myVBS)。在所有這些情況下,它都會返回,並且類未註冊並失敗。

//throws exception 
CPAPPLETLib.CPAppletMgr cpAppletMgr= new CPAPPLETLib.CPAppletMgr(); 

// myType does not come back null 
Type myType = Type.GetTypeFromProgID("CPApplet.CPAppletMgr"); 
// throws exception 
object myObject = Activator.CreateInstance(myType); 

更新:我可以創建Scripting.FileSystemObject沒有問題。我不需要那個......這只是一個測試。

我試過編譯32位,64位。以標準用戶身份運行並提升。我試過再次註冊這個DLL,但是關於我的C#.NET EXE的一些事情正在做一些它只是看不到COM的東西。我甚至嘗試創建一個全新的控制檯應用程序項目,它也在那裏。

我是否錯過了.NET 101 COM-Interop的基礎知識?

Retrieving the COM class factory for component with CLSID {096C5BA8-044B-4BAC-9914-144723BA4F2A} failed due to the following error: 80040154 Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)). 

更新:

設置平臺到x64作出錯誤消失。任何CPU和x86都會失敗。這是否意味着我必須爲我的32位和64位工作站創建2個EXE版本?

+0

本文可能有所幫助:[在x64 Windows上使用32位或64位ActiveX組件](http://cknotes.com/using-32-bit-or-64-bit-activex-components-on- x64-windows /) – TnTinMn

回答

1

這並不意味着您必須創建兩個實例。只要製作AnyCPU,您就應該可以創建一個。問題是,你必須使用正確的運行時註冊它。默認情況下,Visual Studio在64位機器上使用32位運行時註冊AnyCPU。如果確保使用64位運行時和正確版本的運行時運行regasm.exe,則應該能夠從64位進程調用它。

但是,在我的商店中,我們通常編譯一個用於x86和一個用於x64,併爲正確的平臺部署正確的一個。

+0

我其實有很多這方面的經驗,並且因爲某些原因只是有糟糕的一天。試圖縮小我從Any CPU切換到x86的原因,但未注意到「首選32位」選項。我錯誤地認爲我的進程運行64位並將其標記爲可能的原因。這讓我備份在一個角落,強調問什麼可能導致如此簡單的事情。 –