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

时间:2019-02-04 12:11:14

标签: c# wix

我正在尝试使用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>

1 个答案:

答案 0 :(得分:0)

这与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使用的约定,因此您可以考虑自己使用该约定。