如何在Wix合并模块中安装字体

时间:2016-01-08 20:13:36

标签: wix

我正在尝试安装一些我们的几个应用程序通用的字体,所以看起来将它们放在一个共享合并模块中是可行的方法。但我无法获得精确的Wix语法。这是我的合并模块配置文件中的内容:

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  <Module Id="TS3DFontsMerge" Language="1033" Version="1.0.0.0">
    <Package Id="F6029400-FD05-4213-A0B2-1755387595BF" Manufacturer="Tech Soft 3D" InstallerVersion="200" />
    <DirectoryRef Id="FontsFolder">
          <Component Id="TechSoft3DFonts" Guid="0B9C43FC-3835-42DE-80F6-1DB2A912BEE5">
              <File Id="ts3d.ttf" Source="..\..\..\samples\fonts\ts3d.ttf" TrueType="yes" />
              <File Id="MyriadCAD.otf" Source="..\..\..\samples\fonts\MyriadCAD.otf" TrueType="yes" />
      </Component>
    </DirectoryRef>
  </Module>
</Wix>

我正在关注here描述的模型。在这种情况下,我收到此错误:

  

ts3d_fonts_merge.wxs(5,0):错误CNDL0205:具有Id'FontsFolder'的目录不是有效的根目录。每个产品或模块可能只有一个根目录,其Id属性值必须为“TARGETDIR”,其Name属性值必须为“SourceDir”。   ts3d_fonts_merge.wxs(5,0):错误CNDL0025:Directory元素需要Name属性,因为没有父Directory元素。

所以我的问题是:如何让Wix识别合并模块中的FontsFolder预定义ID?我正在使用WixToolset v3.10。

以下是我尝试的其他一些事情......

当我直接在主产品安装程序中使用它时,我不得不使用&lt; directory&gt;标记而不是&lt; DirectoryRef&gt;,这是有效的。但是当我在合并模块中使用它时,我收到此错误消息:

  

ts3d_fonts_merge.wxs(5,0):错误LGHT0094:未解决对“模块:TS3DFontsMerge”部分中“目录:FontsFolder”的引用。

如果我将FontsFolder包装在TARGETDIR标记中(如第一个错误所示),我会收到警告,说明字体安装在错误的位置。以下是错误消息:

  

light.exe(0,0):警告LGHT1076:ICE07:'ts3d.ttf.F6029400_FD05_4213_A0B2_1755387595BF'是一个字体,必须安装到FontsFolder。当前安装目录:'FontsFolder.F6029400_FD05_4213_A0B2_1755387595BF'   light.exe(0,0):警告LGHT1076:ICE07:'MyriadCAD.otf.F6029400_FD05_4213_A0B2_1755387595BF'是一个字体,必须安装到FontsFolder。当前安装目录:'FontsFolder.F6029400_FD05_4213_A0B2_1755387595BF'

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

一些快速建议:

  • FontsFolder是一个将自动为您填充的属性,因此请务必使用<Directory>而不是<DirectoryRef> - https://msdn.microsoft.com/en-us/library/aa368605(v=vs.85).aspx
  • 就像您所了解的那样,任何模块都需要一个整体的目录
  • 你给我的链接有你想要的答案,但不是那个被检查的答案...试试这个建议:https://stackoverflow.com/a/33290209
  • 为了在以后的文件管理中省去麻烦,您可能希望将每个文件都放在它自己的组件中。

所以最后,你应该接近:

?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  <Module Id="TS3DFontsMerge" Language="1033" Version="1.0.0.0">
    <Package Id="F6029400-FD05-4213-A0B2-1755387595BF" Manufacturer="Tech Soft 3D" InstallerVersion="200" />
    <Directory Id="TARGETDIR">
      <Directory Id="FontsFolder">
            <Component Id="TechSoft3DFonts" Guid="0B9C43FC-3835-42DE-80F6-1DB2A912BEE5">
                <File Id="ts3d.ttf" Source="..\..\..\samples\fonts\ts3d.ttf" TrueType="yes" />
                </Component>
                <Component Id="TechSoft3DFonts2" Guid="0B9C43FC-3735-42DE-80F6-1DB2A912BEE5">
                <File Id="MyriadCAD.otf" Source="..\..\..\samples\fonts\MyriadCAD.otf" TrueType="yes" />
        </Component>
      </Directory>
    </Directory>
  </Module>
</Wix>

答案 1 :(得分:1)

我遇到了同样的问题,但我没有从上一个答案中得到完整的解决方案。

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
     xmlns:netfx="http://schemas.microsoft.com/wix/NetFxExtension"
     xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">

  <Product (...)>
    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="FontsFolder" />
    </Directory>

    <DirectoryRef Id="FontsFolder">
      <Component Id="MyFont" Guid="0B9C43FC-3735-42DE-80F6-1DB2A912BEE5">
        <File Id="MyFont.otf" Source="Fonts\MyFont.otf" TrueType="yes" />
      </Component>
      <Component Id="MySecondFont" Guid="0B9C43FC-3835-42DE-80F6-1DB2A912BEE5">
          <File Id="MySecondFont.otf" Source="Fonts\MySecondFont.otf" TrueType="yes" />
        </Component>
    </DirectoryRef>

    <Feature Id="FontsInstallation" Title="Install and Register Company Fonts" Level="1">
      <ComponentRef Id="MyFont"/>
      <ComponentRef Id="MySecondFont"/>
    </Feature>
  </Product> 
</Wix>

该字体在Paint或Word中不可见,但我可以使用XAML / WPF代码以原始名称引用它(因为它们将安装在Windows中):

<TextBlock FontFamily="My First Font" FontSize="30">Sample text</TextBlock>
<TextBlock FontFamily="My Second Font" FontSize="30">Sample text</TextBlock>

字体文件设置为构建操作 内容复制到输出目录 DoNotCopy