.NET Process无法创建ActiveX对象

时间:2017-02-09 18:57:42

标签: c# .net com sccm

我撞到了一块我明白的墙。我有一个简单的COM服务器,我想实例化。我可以在我的EXE之外使用简单的VBS或PS命令来实现:

$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会使错误消失。 AnyCPU和x86失败。这是否意味着我必须为我的32位和64位工作站创建两个版本的EXE?

1 个答案:

答案 0 :(得分:1)

这并不一定意味着您必须创建两个实例。只要你将AnyCPU设为AnyCPU,你就应该只创建一个。问题是,您必须使用正确的运行时注册它。默认情况下,Visual Studio在64位计算机上将AnyCPU注册为32位运行时。如果确保使用64位运行时运行regasm.exe并运行正确的运行时版本,那么您应该能够从64位进程调用它。

然而,在我的商店中,我们通常编译一个用于x86,一个用于x64,并为正确的平台部署正确的一个。