5

所以,我正在尝试创建一个合并模块,其中有多个 wxs 文件。自从我的项目构建成功以来,我认为一切都很好。后来,我意识到其中一个二级 wxs 文件的 Source 属性中使用的路径完全错误,但编译器没有给出以下错误:

系统找不到文件'..\..\release_area\WrongPath\Component2.dll'。

在辅助 wxs 文件中,我添加了一个DirectoryRef元素,该元素引用主 wxs 文件中的文件夹AssemblyFolder以创建两个文件之间的引用。

主 wxs 文件

<Module Id="MyModule" Language="1033" Version="1.0.0.0">
    <Package InstallerVersion="200" Platform="x86"/>
    <Directory Id="TARGETDIR" Name="SourceDir">
        <Directory Id="AssemblyFolder">   
            <Component Id="Component1.dll">
             <File Id="Component1.dll" Name="Component1.dll" 
          KeyPath="yes" Assembly=".net" 
          Source="..\..\release_area\Comp\Component1.dll" />
         </Component>
        </Directory>
    </Directory>
</Module>

辅助 wxs 文件

<Fragment>
    <DirectoryRef Id="AssemblyFolder">
        <Component Id="Component2.dll">
         <File Id="Component2.dll" Name="Component2.dll" 
             KeyPath="yes" Assembly=".net" 
             Source="..\..\release_area\WrongPath\Component2.dll" />
     </Component>
    </DirectoryRef>
</Fragment>

只是为了澄清:为了测试,我<Component Id="Component2.dll">直接在主 wxs 中复制了我的错误:系统找不到文件 '..\..\release_area\WrongPath\Component2.dll'。

所以,我的猜测是辅助 wxs 文件和主 wxs 文件之间的引用是完全错误的,这就是编译器不验证文件路径但我无法弄清楚问题所在的原因。

4

1 回答 1

5

问题不在编译器 (candle.exe) 中。Candle.exe 创建单独的“部分”(模块和片段都是“部分”)。链接器 (light.exe) 负责将它们拉到一起。Light.exe 从“入口部分”(产品、模块或补丁)开始,并从那里向下跟踪引用。由于您的 Main.wxs 没有对 Secondary.wxs 的引用,因此 Secondary.wxs 中的内容永远不会被拉入。要解决此问题,只需添加:

<ComponentRef Id="Component2.dll"/>

在你的 Module 元素下的某个地方(我通常把它们放在最后)。如果你有很多组件,那么 ComponentGroup 和 ComponentGroupRef 就会变得有用。

于 2009-09-26T06:51:33.640 回答