.NET进程无法创建ActiveX对象
我正在点击我理解的墙。我有一个简单的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版本?
这并不意味着您必须创建两个实例。只要制作AnyCPU,您就应该可以创建一个。问题是,你必须使用正确的运行时注册它。默认情况下,Visual Studio在64位机器上使用32位运行时注册AnyCPU。如果确保使用64位运行时和正确版本的运行时运行regasm.exe,则应该能够从64位进程调用它。
但是,在我的商店中,我们通常编译一个用于x86和一个用于x64,并为正确的平台部署正确的一个。
我其实有很多这方面的经验,并且因为某些原因只是有糟糕的一天。试图缩小我从Any CPU切换到x86的原因,但未注意到“首选32位”选项。我错误地认为我的进程运行64位并将其标记为可能的原因。这让我备份在一个角落,强调问什么可能导致如此简单的事情。 –
本文可能有所帮助:[在x64 Windows上使用32位或64位ActiveX组件](http://cknotes.com/using-32-bit-or-64-bit-activex-components-on- x64-windows /) – TnTinMn