.NET Process 无法创建 ActiveX 对象



我遇到了一堵我能理解的墙。我有一个简单的COM服务器,我想实例化它。我可以在EXE之外使用简单的VBS或PS命令:

$sms_client = New-Object -COM 'CPApplet.CPAppletMgr'
Set controlPanelAppletManager = CreateObject("CPApplet.CPAppletMgr") 

在我的C#代码中,我尝试了早期绑定、后期绑定、PS运行空间/管道,最后是Process。启动(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);

更新:我可以创建脚本。FileSystemObject没有问题。我不需要。。。这只是一次测试。

我试过编译32位、64位。以标准用户身份运行并提升。我再次尝试注册DLL,但我的C#有些问题。NET EXE正在做一些它看不到COM的事情。我甚至尝试创建一个全新的控制台应用程序项目,它也在那里做。

我是不是错过了什么。NET 101 COM互操作基础?

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?

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

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

最新更新