WIX:可执行文件在子目录中找不到 dll

WIX: Executable does not find dlls in subdirs

我正在尝试使用 Wix 创建一个 msi,并让安装文件夹使用给定的结构,在这种情况下,将第三方 dll 放在名为 lib 的子文件夹中。

问题是,MyApplication.exe 崩溃了。调试告诉我它找不到Interactions.dll。如果我将 dll 放在 INSTALLFOLDER 而不是子文件夹中,它就可以正常工作。

<Feature Id="ProductFeature" Title="MyApplication" Level="1">
    <ComponentGroupRef Id="Executable"/>
    <ComponentGroupRef Id="ProductComponents"/>
</Feature>

<Fragment>
  <Directory Id="TARGETDIR" Name="SourceDir">
    <Directory Id="ProgramFilesFolder">
      <Directory Id="Organisation" Name="OrganizationFolder">
        <Directory Id="INSTALLFOLDER" Name="MyApplication">
          <Directory Id="lib" Name="lib"/>
        </Directory>
      </Directory>
    </Directory>
  </Directory>
</Fragment>

<Fragment>
  <ComponentGroup Id="Executable" Directory="INSTALLFOLDER">
    <Component Id="MyApplication.exe" Guid="*">
      <File Id="MyApplication.exe" Name="MyApplication.exe" Source="$(var.MyApplication_TargetDir)MyApplication.exe" Vital="yes" />
    </Component>
  </ComponentGroup>
</Fragment>

<Fragment>
  <ComponentGroup Id="ProductComponents" Directory="lib">
    <Component Id="Microsoft.Expression.Interactions.dll" Guid="*">
          <File Id="Microsoft.Expression.Interactions.dll" Name="Microsoft.Expression.Interactions.dll" Source="$(var.MyApplication_TargetDir)Microsoft.Expression.Interactions.dll" />
    </Component>
  </ComponentGroup>
</Fragment>

这与 wix 无关,而是 .Net 运行时定位程序集的方式 - 它不知道您希望它在 lib 子目录中搜索 Microsoft.Expression.Interactions.dll。您可以在应用程序的配置文件中使用探测元素来告诉它在哪里可以找到这个程序集和其他依赖程序集(有关详细信息,请参阅 here):

<configuration>  
   <runtime>  
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">  
         <probing privatePath="lib"/>  
      </assemblyBinding>  
   </runtime>  
</configuration> 

另请注意,按照惯例,依赖程序集通常位于 "bin" 子目录中,而不是 "lib";至少这是 ASP .Net 使用的约定,因此您可以考虑自己使用该约定。