2016-01-01 55 views
0

我正在尝试部署新的.net Com可见接口。安装后,我的新的.dll可以被我的应用程序加载。有一个要求是转换其中一个不工作的接口。部署和注册Com Interop接口

我正在使用Heat来收获我的wix xml。

"C:\Program Files (x86)\WiX Toolset v3.10\bin\heat.exe" file "MYComConnect.dll" /out "dll_fragment_12_2015.wxs" 

"C:\Program Files (x86)\WiX Toolset v3.10\bin\heat.exe" file "MYComConnect.tlb" -scom /out "tlb_fragment_12_2015.wxs" 

要知道这是不是编码的问题,我的.dll我已经注册了我的.dll和.TLB与regasm,一切工作正常。

"C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe" "MYComConnect.dll" /tlb 

我然后做的是什么regasm添加注册表比较,什么我的WiX的安装程序添加。

我注意到下列文件夹键被regasm添加,但不是由我威克斯添加安装(对应值也由regasm添加,但我不会发布这一切)

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

看来,我的wix install只会在Wow6432Node中添加注册表项。 Regasm为两者添加了钥匙。

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

另一个区别我注意的是,热已经为每个类,而Regasm以下条目没有它

HKLM\SOFTWARE\Classes\Wow6432Node\CLSID\{FB1D6314-4409-46E9-BD92-DDD99D110CDE}\Implemented Categories\{62C8FE65-4EBB-45e7-B440-6E39B2CDBF29}\: "" 

我已阅读,它并不重要,其中的接口被注册为他们然而,在比较什么是regasm和热量收获之后,不要依赖bitness,但是如果接口没有被添加到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="..\..\MYComConnectReferencedDLL\MYComConnect.tlb" /> 
     <RegistryValue Root="HKCR" Key="Interface\{6D8A24A9-9723-4934-9852-D8877BBBB9F6}" Value="_MYAppConnect" Type="string" Action="write" /> 

所以在没有另一种解决方案我想跟进与注册表项所做regasm中,我怎么能做到这一点与我的维克斯XML。

编辑 - 进一步的信息

  1. 目标计算机是Win 7的64位与Office 2010的86
  2. 我的主要应用有目标CPU 86
  3. 的COM可见的.dll目标CPU值为anycpu(该DLL由Office和我的应用程序使用)
  4. MSI是x64(因为我已经有一个上下文菜单.dll需要将注册表项写入x64,以便Windows的x64资源管理器将读取米

我希望这不会使事情变得复杂,但什么我的COM可见DLL确实是allows me to call code in a VSTO addin.我不认为这个代码是必要的,因为我可以从办公室让我的自定义对象和它没有任何问题投给我的自定义界面,如果我使用regasm注册我的.dll并创建tlb文件。

我实际上在我的开发PC上没有注册任何东西,并安装了我的最终MSI。我的.dll工作,我可以投我的界面。我能从中得出什么假设?我假设问题出在我的Com.dll上并构建它,因此我的问题与我的散热收集和wix xml编码无关。

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

因此,我现在必须弄清楚为什么在一台PC上构建它,而在另一台上则不行。现在最主要的区别是,PC上运行的是Win 7,不能运行的是Win 10.

回答

0

这可能有助于了解您的应用程序和MSI构建的位数。

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

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