部署和注册Com Interop接口



我正在尝试部署我的新的.net可视接口。安装后,我的应用程序可以加载我的新.dll。需要强制转换其中一个不起作用的接口。

我正在使用Heat获取我的wix-xml。

"C:Program Files (x86)WiX Toolset v3.10binheat.exe" file "MYComConnect.dll" /out "dll_fragment_12_2015.wxs"
"C:Program Files (x86)WiX Toolset v3.10binheat.exe" file "MYComConnect.tlb" -scom /out "tlb_fragment_12_2015.wxs"

为了知道这不是我的.dll的编码问题,我已经向regasm注册了我的.dll和.tlb,一切都很好。

"C:WindowsMicrosoft.NETFrameworkv4.0.30319RegAsm.exe" "MYComConnect.dll" /tlb

然后,我对regasm添加的内容和我的wix安装程序添加的内容进行了注册表比较。

我注意到以下文件夹密钥是由regasm添加的,但不是由我的wix安装添加的(regasm也添加了相应的值,但我不会全部发布)

HKLMSOFTWAREClassesInterface{6D8A24A9-9723-4934-9852-D8877BBBB9F6}
HKLMSOFTWAREClassesInterface{6D8A24A9-9723-4934-9852-D8877BBBB9F6}ProxyStubClsid32
HKLMSOFTWAREClassesInterface{6D8A24A9-9723-4934-9852-D8877BBBB9F6}TypeLib
HKLMSOFTWAREClassesInterface{721AE779-4A04-4FFE-B317-FE2355DE31FA}
HKLMSOFTWAREClassesInterface{721AE779-4A04-4FFE-B317-FE2355DE31FA}ProxyStubClsid32
HKLMSOFTWAREClassesInterface{721AE779-4A04-4FFE-B317-FE2355DE31FA}TypeLib
HKLMSOFTWAREClassesInterface{A001212B-8F67-42B6-BAA6-D61D6B34FC26}
HKLMSOFTWAREClassesInterface{A001212B-8F67-42B6-BAA6-D61D6B34FC26}ProxyStubClsid32
HKLMSOFTWAREClassesInterface{A001212B-8F67-42B6-BAA6-D61D6B34FC26}TypeLib
HKLMSOFTWAREClassesInterface{F293DBB5-471C-4D71-80CB-C3B30EBDFE10}
HKLMSOFTWAREClassesInterface{F293DBB5-471C-4D71-80CB-C3B30EBDFE10}ProxyStubClsid32
HKLMSOFTWAREClassesInterface{F293DBB5-471C-4D71-80CB-C3B30EBDFE10}TypeLib

我的wix安装似乎只在Wow6432Node中添加了注册表项。Regism为两者添加了关键。

HKLMSOFTWAREClassesWow6432NodeInterface{6D8A24A9-9723-4934-9852-D8877BBBB9F6}
HKLMSOFTWAREClassesWow6432NodeInterface{6D8A24A9-9723-4934-9852-D8877BBBB9F6}ProxyStubClsid32
HKLMSOFTWAREClassesWow6432NodeInterface{6D8A24A9-9723-4934-9852-D8877BBBB9F6}TypeLib
HKLMSOFTWAREClassesWow6432NodeInterface{721AE779-4A04-4FFE-B317-FE2355DE31FA}
HKLMSOFTWAREClassesWow6432NodeInterface{721AE779-4A04-4FFE-B317-FE2355DE31FA}ProxyStubClsid32
HKLMSOFTWAREClassesWow6432NodeInterface{721AE779-4A04-4FFE-B317-FE2355DE31FA}TypeLib
HKLMSOFTWAREClassesWow6432NodeInterface{A001212B-8F67-42B6-BAA6-D61D6B34FC26}
HKLMSOFTWAREClassesWow6432NodeInterface{A001212B-8F67-42B6-BAA6-D61D6B34FC26}ProxyStubClsid32
HKLMSOFTWAREClassesWow6432NodeInterface{A001212B-8F67-42B6-BAA6-D61D6B34FC26}TypeLib
HKLMSOFTWAREClassesWow6432NodeInterface{F293DBB5-471C-4D71-80CB-C3B30EBDFE10}
HKLMSOFTWAREClassesWow6432NodeInterface{F293DBB5-471C-4D71-80CB-C3B30EBDFE10}ProxyStubClsid32
HKLMSOFTWAREClassesWow6432NodeInterface{F293DBB5-471C-4D71-80CB-C3B30EBDFE10}TypeLib

我注意到的另一个区别是,每个等级的热量都有以下条目,而Regism没有

HKLMSOFTWAREClassesWow6432NodeCLSID{FB1D6314-4409-46E9-BD92-DDD99D110CDE}Implemented Categories{62C8FE65-4EBB-45e7-B440-6E39B2CDBF29}: ""

我读到,接口在哪里注册并不重要,因为它们不取决于比特率。然而,在比较regasm的作用和热量收获后,如果接口没有同时添加到x64和x32注册表中,则它似乎不起作用。

我的热获取接口片段中的第一个RegistryValue元素如下所示。这将元素添加到Wow6432Node。

<Fragment>
  <DirectoryRef Id="MYAPPCOMINTEROP">
    <Component Id="Com_Interop_TLB" Guid="{F8F60B35-0270-4569-8F0F-9D09398C72D8}">
      <File Id="fil460187E36ECD90A7A9A00591ADB1C5CB" Name="MYComConnect.tlb" KeyPath="yes" Source="....MYComConnectReferencedDLLMYComConnect.tlb" />
        <RegistryValue Root="HKCR" Key="Interface{6D8A24A9-9723-4934-9852-D8877BBBB9F6}" Value="_MYAppConnect" Type="string" Action="write" />

因此,在没有其他解决方案的情况下,我想了解regasm对注册表项的处理方式,以及如何使用Wix-xml实现这一点。

编辑-更多信息

  1. 目标计算机是带有Office 2010 x86的Win 7 x64
  2. 我的主应用程序具有目标CPU x86
  3. Com-Visible.dll目标CPU为AnyCPU(dll由Office和我的应用程序使用)
  4. MSI是x64(因为我已经有一个上下文菜单.dll,它需要将注册表项写入x64,以便Windows的x64资源管理器读取它们

我希望这不会使事情复杂化,但我的COM Visible dll所做的是允许我调用VSTO插件中的代码。我认为这段代码没有必要,因为如果我使用regasm注册我的.dll并创建tlb文件,我可以从Office获得我的自定义对象,并将其转换到我的自定义接口,而不会出现任何问题。

事实上,我在我的开发PC上注册了所有东西,并安装了我的最终MSI。我的.dll正常工作,我可以投射我的接口。我能从中做出什么假设?我假设问题出在我的Com.dll和构建它上,因此我的问题与我的热量收集和wix-xml编码无关。

问题的更新2我获得了第二台装有Visual Studio的电脑。我在上面复制了我的Com.dll项目并构建了它。我在这台电脑上用Tlbexp.exe创建了.tlb文件。然后我用MSI安装了它,现在我可以转换Com接口了。

所以我现在必须弄清楚为什么在一台电脑上构建它是有效的,而在另一台电脑却不起作用。现在最主要的区别是,工作的电脑上有Win 7,不工作的电脑是Win 10。

了解应用程序和MSI构建的比特性可能会有所帮助。

32位应用程序将具有32位注册表视图,并且需要对32位COM dll的CLSID引用。接口条目可能引用ProxyStub CLSID,该CLSID也需要是32位的,这意味着接口条目具有位性。无论如何,这是我的理解,所以如果您的COM Dll同时具有64位和32位调用者,那么它需要本地和32位WoW6432中HKCR(HKL\Software\Classes)中的CLSID和接口引用。

在WiX中,您可以将Win64=yes添加到组件中,使其成为64位。如果您的COM有32位和64位调用方,那么在64位MSI中,您将为COM添加32位和32位组件,而在单独的32位MSI中仅添加32位组件。Heat不知道您最终MSI的大小,所以您可以在组件上使用Win64来定位所需的注册表视图。

最新更新