2011-11-18 74 views
2

我开发了一个示例c#COM-Visible DLL。
内置x86并通过32位Regasm注册,它可以通过COM Client很好地执行。
内置64位,并通过64位Regasm注册,COM客户端调用生成以下错误:问题为COM Interop注册x64程序集

Retrieving the COM class factory for component with CLSID {A0F2F58F-7B98-3605-BEC9-84724FF1E824} failed due to the following error: 80040154. 

我检查并确保该CLSID是下HKCR \ CLSID注册表确实存在。

下面是模拟通过C#中的COM访问的例子:

var type = Type.GetTypeFromProgID("ProgID.Interop.5683"); 
var obj = Activator.CreateInstance(type); // <-- blows here 

我也通过将procmon检查,有通过PROGID 问题是,哪里是激活看完全是一个成功的访问类型?以及如何使它“看到”我的x64注册程序集?有什么我需要添加的地方?

我发现许多“解决方案”建议x86重新构建。但是Come'on!我不打算这样做,只是为了COM而失去所有x64的好处。有没有“真正的”解决方案?

+0

在什么情况下会抛出80040154错误? –

+0

@Ramhound当CLSID不在或不在正确的位置时。所以我很困惑。 –

+2

您不会为特定体系结构构建受管DLL,只有EXE项目的设置很重要。经典错误是使用Regasm.exe的错误位或忘记/ codebase选项。使用SysInternals的ProcMon实用程序进行故障排除。 –

回答

0

在经过了一夜的睡眠和一点事后,我发现需要从x64应用程序调用Activator来查找x64 CLSID,方法是在注册表中查找x64位置。 即,当从x86应用程序调用时,Activaor将在注册表中的x86位置查找CLSID和随后的密钥(包括代码库)。

var type = Type.GetTypeFromProgID("ProgID.Interop.5683"); 
var obj = Activator.CreateInstance(type); 
+1

这是因为x86和x64 EXE/DLL(COM或其他)不会混合,就像使用类似的。 – user7116

+0

@sixlettervariables:是的,这是我在这里与我的其他问题了解到的:http://stackoverflow.com/questions/8193857/calling-an-x64-assembly-via-com-from-a-32-bit-app/8194293#8194293 –

相关问题