我开发了一个示例c#COM-Visible DLL 内置x86并通过32位Regasm注册,它由COM客户端执行良好 COM客户端调用内置x64并通过64位Regasm注册,会丢失以下错误:
Retrieving the COM class factory for component with CLSID {A0F2F58F-7B98-3605-BEC9-84724FF1E824} failed due to the following error: 80040154.
我检查并确保CLCRID确实存在于HKCR \ CLSID下的注册表中。
以下是通过c#模拟COM Access的示例:
var type = Type.GetTypeFromProgID("ProgID.Interop.5683");
var obj = Activator.CreateInstance(type); // <-- blows here
我还通过procmon检查了通过progId成功访问该类型
问题是,Activator在哪里看起来完全正确?以及如何让它“看到”我的x64注册程序集?我需要在某处添加一些内容吗?
我发现许多“解决方案”建议重新构建x86。但是来吧!我不会这样做,只是为了COM而失去所有x64的好处。那是否有“真正的”解决方案?
答案 0 :(得分:0)
经过一夜的睡眠和一点后见之后,我发现需要从x64应用程序调用Activator,通过查看注册表中的x64位置来查找x64 CLSID。 即,当从x86应用程序调用时,Activaor会在Registry的x86位置查找CLSID和后续密钥,包括代码库。
var type = Type.GetTypeFromProgID("ProgID.Interop.5683");
var obj = Activator.CreateInstance(type);