C# 让WIX在项目中包含引用

C# 让WIX在项目中包含引用,c#,winforms,wix,C#,Winforms,Wix,我对WiX和设置自定义安装程序是完全陌生的,所以我为这个问题道歉 我有一个内部业务应用程序(日记),它构建和运行良好,因此我遵循教程/官方文档添加WiX项目并引用日记的csproj 在构建并运行这个最基本版本的WiX安装程序之后,输出目录中有一个单独的exe文件,该文件在加载后瞬间崩溃,并出现“未找到文件”异常 我的猜测是,它既没有内置Crystal Report也没有内置NLog,这两者都在我的CSProj中引用 我的问题是,我如何让WIX包含并构建那些对输出的项目引用 非常感谢您的帮助! /

我对WiX和设置自定义安装程序是完全陌生的,所以我为这个问题道歉

我有一个内部业务应用程序(日记),它构建和运行良好,因此我遵循教程/官方文档添加WiX项目并引用日记的csproj

在构建并运行这个最基本版本的WiX安装程序之后,输出目录中有一个单独的exe文件,该文件在加载后瞬间崩溃,并出现“未找到文件”异常

我的猜测是,它既没有内置Crystal Report也没有内置NLog,这两者都在我的CSProj中引用

我的问题是,我如何让WIX包含并构建那些对输出的项目引用

非常感谢您的帮助!
/Antony

与旧版Visual Studio中的(现已失效)安装项目不同,WiX不执行自动引用检测。您必须手动将每个引用的项目添加到WiX项目中,就像您对主项目所做的那样。

不幸的是,您必须进行一些手动操作才能正确完成项目。我将采用以下两种方法之一,这需要您编辑.wixproj文件:

  • 使用任务。您必须对所有引用的项目执行此操作,它将为所有项目提供单独的.wxs文件。在此之后,请在基于WIX的设置的功能中引用这些文件中的组件组

    <Target Name="BeforeBuild">
      <HeatProject ToolPath="$(WixToolPath)" AutogenerateGuids="true" OutputFile="OutputFile.wxs" SuppressFragments="true" Project="ReferencedProject.csproj" ProjectOutputGroups="Binaries" />
    </Target>
    

  • WIX设置是否包含项目中的任何输出文件?您是否能够共享WIX中将项目包括在设置中的部分?这可能有助于更好地理解您的问题。您还应该尝试使用Orca,这将帮助您查看最终安装msi中包含的内容。除了您之外,没有人知道您应该在安装程序中包含哪些引用程序集,也不知道它们应该安装在何处。VisualStudio的“复制到输出”功能是为了方便在开发人员的机器上进行调试。这可能是因为它们正是您想要安装的,并且您希望它们都安装到相同的位置。如果确实是这样,那么正如@sttaq所解释的,用这种方式收获是很容易的。另一方面,对于一些第三方组件,我运行它们的安装程序。您可以将安装程序与WiX Bootstrapper项目链接并捆绑在一起。感谢您,很明显,我找不到关于让WiX在其他第三方库中构建的信息,这些第三方库在(已被WiX引用的)项目中引用。谢谢,我确实试着从命令行运行heat来获取我的项目,但它最终什么也没做(与您的解决方案分开)!要对此答案添加更多内容,使用选项2,您需要像原始product.wxs文件一样将OutputFile(示例中为OutputFile.wxs)添加到Wix项目中,然后您可以将ComponentGroupRef添加到功能中node@ToddK是否可以在不将文件存储在版本控制中的情况下执行此操作?我想将生成的文件存储为
    $(IntermediateOutputPath)\Product.generated.wxs
    ,然后以某种方式引用它。我不签入生成的文件。这个项目有它的引用,当你最初签出版本控制时,它会显示一个警告图标,指出文件丢失了,但是一旦你编译,文件就及时存在了(
    DefineConstants
    GenerateGuidsNow
    SuppressRootDirectory
    ToolPath
    )是必要的!我原以为默认设置会涵盖我,但没有。这不是成功的秘诀。
    <Target Name="BeforeBuild">
      <PropertyGroup>
        <DefineConstants>BINFOLDER=PATH\TO\YourProject\bin\$(Configuration)</DefineConstants>
      </PropertyGroup>
      <HeatDirectory OutputFile="OutputFile.wxs" Directory="PATH\TO\YourProject\bin\$(Configuration)" KeepEmptyDirectories="true" DirectoryRefId="INSTALLFOLDER" ComponentGroupName="UniqueComponentGroupName" SuppressCom="true" SuppressFragments="true" SuppressRegistry="true" SuppressRootDirectory="true" GenerateGuidsNow="true" ToolPath="$(WixToolPath)" PreprocessorVariable="var.BINFOLDER" />
    </Target>