在WXS中,如何引用通过其他组件安装的文件?

时间:2011-07-28 19:21:46

标签: com wix regasm heat

这个问题是指来自heat.exe的输出。我正在尝试为MSI中的COM互操作注册一些.NET程序集做“正确的事情”。 Regasm.exe是错误的东西

  

直接调用regasm.exe,这很容易并且“主要”起作用,显然不是一个好主意,says Rob Mensching。   该博客文章解释了为什么它不是一个好主意,并且还提供了一个非常简单的解决方案。不幸的是,2004年的帖子暗示了一个现已弃用或不受支持的wix功能。   我想,那里描述的解决方案不再有效,但该博客文章中提出的问题仍然存在。

     

显然,问题的“正确”解决方案是运行heat.exe然后“修复”目录引用等等。这听起来很简单,而且正是我想要做的。

好的,所以我正在努力做正确的事。另外我不想GAC汇编,这意味着我必须使用codebase参数进行COM注册。 heat.exe的输出包括以下内容:

    <RegistryKey Root="HKCR" Key="CLSID\{xxx-GUID-HERE-xxx-xxx}\InprocServer32\1.2.3.4" >
      <RegistryValue Name="Class" Value="My.DotNet.Classname.Here" Type="string" />
      <RegistryValue Name="Assembly" Value="Strongname of .NET Assembly here" />
      <RegistryValue Name="RuntimeVersion" Value="v2.0.50727" Type="string" />
      <RegistryValue Name="CodeBase" Value="file:///[#fil4B562083D141F5A2F29E28A1BD09AF3E]" Type="string" />
    </RegistryKey>

第一个问题:Value="file:///[#fil4B562083D141F5A2F29E28A1BD09AF3E]"究竟是什么?

在我看来,fil4B562083D141F5A2F29E28A1BD09AF3E是由Wix生成的Id;该id属于.wxs文件中的File元素,该文件引用包含指定.NET类的程序集(DLL)的路径。现在,octothorpe到底是什么?和方括号?和file:///前缀?帮助我理解这种语法。

我问的原因 - 我不想使用此ID。我已经有了一个文件ID,它反映了文件的实际含义,并不是那样的。

但是有问题的文件安装在不同的组件中。当我尝试引用该文件时,我收到了一堆这样的错误消息:

  C:\dev\project\ComRegistration.wxs(397): warning LGHT1076: ICE69: Mismatched component reference. 
  Entry 'reg9652ABFDD2B970C523070996FE7BB510' of the Registry table belongs to 
  component 'C.ComRegistration'. However, the formatted string in column 'Value' references 
  file 'MyAssembly.dll' which belongs to component 'C.Main'. Components are in the same 
  feature. [C:\dev\project\MyProject.wixproj]

我该如何解决这个问题?

我想我不希望这个组件中有另一个File元素,指的是同一个文件系统文件。它已经安装了不同的组件(相同的功能)。我怎么能参考呢?

基本上我想要一个像FileRef这样的元素,但显然不存在。

1 个答案:

答案 0 :(得分:5)

[#fileId]被文件的路径替换。 (有关完整列表,请参阅"Formatted" in the MSI SDK。)

您可以通过将注册表值和文件放在同一组件中来避免ICE69。 ICE69告诉您,如果没有注册文件,就有可能安装该文件。 (一个假设的FileRef不能解决这个问题。)把它们放在一起,问题不会发生,ICE69也不会抱怨。