首页 > 解决方案 > 附加非托管 DLL 以与 VS 安装程序包一起使用

问题描述

更新:我现在正在使用 Advanced Installer,因为它更容易学习/使用,而且我时间紧迫。它在某种程度上可以更好地自动检测文件,但我仍然想知道需要包含额外的 config/xml 文件,现在还想知道一些预安装命令行,但这将是一个不同的问题。

问:我的应用程序使用 NuGet 包(Accord.Video.FFMpeg 是最严重的违规者),这些包依赖于一系列非托管 dll、exe,甚至是 PSpice 库。我需要将这些全部打包到一个 setup.exe 中(部署在另一台机器上),我正在使用 VS Installer Packages 构建(不再),但我无法让安装程序项目将它们识别为参考。

我的问题确实是我的包依赖的所有 dll ——Accord.Video.FFMpeg 取决于这三个 exe 文件,每个文件都依赖于其他七个 dll。所有这些都需要在部署时最终组合起来。

我无法使用参考管理器添加这些文件。我已经考虑制作第二个 NuGet 包,它将所有内容组合在一起以添加它,但我不确定它是否有必要。我也尝试过“将文件添加为现有项目”,但这并没有让它们在安装程序项目中显示为依赖项。

我正在使用带有用于 x64 的 C# 包的 Visual Studio 2017。现在,所有这些文件都在我项目的调试文件夹中的 libs 文件夹中,并且它们已被“添加为现有文件”。

安装程序项目识别所有最高级别的 dll,但我不知道如何强制添加更多。我是否需要将每个 dll 文件的构建操作设置为“嵌入式资源”并将其复制到输出目录“如果较新则复制”?另外,我是否需要包含我为 NuGet dll/包找到的相关 xml、config、pdb 文件?还有一个 .dylib 文件和一个 .so 文件,但我不确定这些。

我使用 Dependencies 应用程序来查找 Accord.Video.FFMpeg 文件之间的链接。

标签: visual-studiodependency-management

解决方案


我今天早上刚刚构建了一个安装程序,不得不以这种方式添加 Prism dll。从项目中引用并不足以让安装程序自动选择它们。如果它们不在目标机器上的 GAC 中(由于被其他东西安装在那里),那么您必须将它们显式添加到您的安装程序中。

为了添加解决方案外部的 dll 引用,您需要将它们作为单独的组件元素添加到您的 wix 文件中。这是一个使用 log4net 依赖的简短示例。

假设有几件事: 1. 您有一个 Product.wxs 文件,它引用此组件组 C.Lib 2. 您有一个包含此组件组元素定义的 Lib.wxs 文件:

    <ComponentGroup Id="CG.Lib" Directory="INSTALLFOLDER">
        <Component Id="C.Lib">
            <File Source='$(var.Namespace.Of.Yours.TargetPath)' />
        </Component>
        <Component Id="C.log4net">
            <File Source='$(var.Namespace.Of.Yours.TargetDir)/log4net.dll' />
        </Component>
    </ComponentGroup>
  1. 以上是在一个wix片段内。

对于您需要安装的任意数量的 dll 库,可以重复此示例。只需将它们分组在引用它们的项目下。


推荐阅读