5

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

Rob Mensching 说,直接调用 regasm.exe 很简单,而且“大部分时间”都有效,但显然不是一个好主意。该博客文章解释了为什么这不是一个好主意,并提供了一个非常简单的解决方案。不幸的是,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) 的路径。现在,那里的八爪鱼到底是干什么用的?方括号呢?和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,但这显然不存在。

4

1 回答 1

5

[#fileId] 替换为文件的路径。(有关完整列表,请参阅MSI SDK 中的“格式化” 。)

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

于 2011-07-28T20:58:44.573 回答