所以,我正在尝试创建一个合并模块,其中有多个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>
只是为了澄清:为了测试,我直接在主wxs中复制了我的<Component Id="Component2.dll">
并得到错误:系统找不到文件'.. \ .. \ release_area \ WrongPath \ Component2的.dll”。
所以,我的猜测是辅助wxs文件和主wxs文件之间的引用是完全错误的,这就是为什么编译器不验证文件路径但我无法弄清楚问题是什么。
答案 0 :(得分:5)
问题不在编译器(candle.exe)中。 Candle.exe创建单独的“部分”(模块和片段都是“部分”)。链接器(light.exe)负责将它们全部拉到一起。 Light.exe从“入口部分”(产品,模块或补丁)开始,并从那里开始跟随参考。由于您没有从Main.wxs到Secondary.wxs的引用,因此Secondary.wxs中的内容永远不会被提取。要解决这个问题,只需添加:
<ComponentRef Id="Component2.dll"/>
在Module元素下的某个地方(我通常将它们放在最后)。如果你有很多组件,那么ComponentGroup和ComponentGroupRef就会变得有用。