我有一个最初为x86构建的C ++ ATL COM DLL,dll正由为x86构建的.NET 4.0应用程序使用,一切正常。
重新编译x64的COM dll,然后使用c:\windows\system32\regsvr32
注册它(取消注册x86 dll之后),我无法在Visual Studio的Add Reference窗口中看到COM DLL,我导出了HKCR和HKLM \ Softwares的注册码与x64和x86版本的dll注册,没有密钥丢失,相应的键指向正确的dll位置。
此外,在注册x64 dll之后,我可以通过导航到文件所在的文件夹并选择它来添加对dll的引用,但它仍然无法执行(.net程序集设置为x64),并出现以下错误< / p>
System.Runtime.InteropServices.COMException(0x80040154):正在检索 具有CLSID的组件的COM类工厂 {00000000-0000-0000-0000-A797AD238051}由于以下原因而失败 错误:80040154未注册类(HRESULT异常: 0x80040154(REGDB_E_CLASS NOTREG))。在 System.RuntimeTypeHandle.CreateInstance(RuntimeType类型,布尔值 publicOnly,Boolea n noCheck,Boolean&amp; canBeCached, RuntimeMethodHandleInternal&安培; ctor,布尔&amp; bNeedSecurity Check)at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly,Boolean skipCheckThis,Boo lean fillCache)at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipVisibil ityChecks,Boolean skipCheckThis,Boolean fillCache)在System.Activator.CreateInstance(Type type,Boolean 非公开)
我花了相当多的时间在线搜索,但是没有找到任何远程关闭的东西,有人看过这样的东西,或者我可能使用的任何调试工具?
我没有拥有dll的方式,拥有它的人,可以看到一旦在机器上构建了x64 dll,但是已经尝试了其他2台机器,并且它对任何一台机器都不起作用。 / p>
答案 0 :(得分:0)
这个问题已经过时了,我需要更多信息才能完全排除故障。但是,我可以为遇到同一问题的任何人提供一些提示。
鉴于您使用的是regsvr32
,DLL正在使用名为self-registration的内容。这意味着DLL在名为DllRegisterServer的导出函数中处理自己对Windows注册表的添加。正如您似乎发现的那样,注册表项在x86和x64之间有所不同,但这不一定是您的核心问题。您可以(通常应该)同时注册x86和x64类型的库。
检查特定类型库的注册方式的一种方法是oleview工具。注册表中的信息相同,但此工具可能更友好一些。该工具应位于Visual Studio命令提示符下设置的路径中。听起来这个错误是关于具有给定GUID的类,您可以从对象类检查 - &gt;树中的所有对象:
如果您碰巧拥有该类(您可能需要重新注册要检查的x86版本),您可以通过展开刚刚找到的GUID的条目来查找该类实现的COM接口的信息。如果有类型库,它应该这样说。请注意,TypeLib信息中的路径可以有win32
和win64
条目:
没有进一步的信息,很难说,但我猜想x64的自注册和/或类型库有问题。顺便提一下,对于您计划发布的库,您可能不会依赖自行注册 - 安装程序包可以而且应该自己创建注册表项。如果您有更多信息,我可以尝试提供更多细节。