.NET 进程无法创建 ActiveX 对象

.NET Process can't create ActiveX Object

我正在撞墙,我理解。我有一个要实例化的简单 COM 服务器。我可以在我的 EXE 之外使用简单的 VBS 或 PS 命令来做到这一点:

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

Set controlPanelAppletManager = CreateObject("CPApplet.CPAppletMgr") 

在我的 C# 代码中,我尝试了早期绑定、后期绑定、PS runspace/pipeline,最后是 Process.Start( cscript myVBS)。在所有这些情况下,它返回 class 未注册并失败。

//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 位工作站创建 2 个版本的 EXE?

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

但是,在我的店里,我们通常为 x86 编译一个,为 x64 编译一个,然后为正确的平台部署正确的一个。