从Microsoft Windows安装程序类中获取已安装DLL列表

8
我正在尝试编写一个插件(实际上是一个Visual Studio模板向导,用于生成插件),以便为现有应用程序添加功能。作为插件安装的一部分,我必须将条目插入配置数据库中。通常,有多个DLL对应于不同部分的功能,每个部分都需要在相同的表中添加条目,但通常具有不同的表项组合。我需要从我的安装程序中添加这些内容。
出于政策原因,所有内容都使用C#编写。
我目前正在使用Visual Studio Installer(VS2010)创建安装程序。我更喜欢使用可能已安装在用户计算机上的东西来保持模板/向导安装的简单性,但如果必要的话,我可以捆绑/链式安装开源(或至少可以自由重新分发)的替代安装程序。
例如,要向应用程序添加菜单项,我必须将条目插入到几个表中。过去,我使用安装程序助手(有时是应用程序,有时是安装程序类)从安装程序中调用来完成此操作。在那种设计中,我会将需要添加到配置表中的设置嵌入到安装程序助手中,然后通过C#执行SQL来实际进行添加。
问题在于这导致了相同信息在两个地方重复,并且在向导环境中不太可维护或干净。我真的希望能够从一些可以在插件程序集上设置的属性中自省此信息。
但是我在第一步就遇到了问题-我的Installer类如何找出由此安装安装的程序集(或将要安装的程序集)?
我确实考虑过尝试将DLL列表嵌入自定义安装程序属性中,但从我的插件向导生成它将很困难。理想情况下,我可以注册某些现有事件,或者可以读取某些现有属性,但我还没有发现它。

你有一个 .MSI 文件,想要确定它包含哪些 DLL? - Simon Mourier
我有一个安装程序项目(其输出为.msi文件)。安装程序类应该与该.msi文件(包括其中包含的DLL和所选配置)或它所安装的DLL一起工作。 - BradHards
2个回答

3
你可以使用Windows Installer API来获取给定MSI安装包中包含的所有DLL文件。
在C#中,有各种库或示例代码可用于执行此操作。
在这里,我将使用开源Wix工具集项目的DLL。因此,您只需要下载二进制文件(而不是wix安装程序),创建一个项目并添加对该二进制文件目录中Microsoft.Deployment.WindowsInstaller.dllMicrosoft.Deployment.WindowsInstaller.Package.dll的引用。
以下是一个示例程序,它会写出该包中所有DLL文件的内容。
class Program
{
    static void Main(string[] args)
    {
        string path = @"... myfile.msi";
        using (InstallPackage package = new InstallPackage(path, DatabaseOpenMode.ReadOnly))
        {
            foreach (var kvp in package.Files.Where(f => Path.GetExtension(f.Value.TargetName) == ".dll"))
            {
                Console.WriteLine(kvp.Value.TargetName);
            }
        }
    }
}

}


谢谢。有没有办法告诉Installer类它是从哪个MSI文件中调用的?也就是说,避免硬编码@"... myfile.msi"这部分内容。 - BradHards
看这个:https://dev59.com/enPYa4cB1Zd3GeqPouu7 - Simon Mourier
@SimonMourier:请参考https://dev59.com/JkbRa4cB1Zd3GeqPwQJl,了解将MSI路径传递给安装程序的机制。 - Nicole Calinoiu

2
我不清楚在运行向导和看到.msi之间会发生什么。(向导的输出是VS项目还是.msi本身[如果是这样,最终用户根本不需要VS]?)但我们开始吧...
似乎你的瓶颈是Visual Studio Installer。这也是一个定时炸弹,因为它将与VS2010一起死亡。许多项目(例如Visual Studio本身)使用WiX工具集代替。对于Visual Studio和SharpDevelop用户,WiX“可能已安装在用户的计算机上”并且是“开源”的。可以将其作为二进制文件包含在向导中,或者完整产品可通过NuGet、Chocolatey或由用户自己或其他人安装(包括VS扩展程序)。
使用WiX,您编写或生成描述Windows Installer包内容、UI和操作序列的XML文件。 WiX可执行文件用于执行实际构建。如果安装了WiX的MSBuild文件,则可以使用MSBuild项目来协调构建。如果安装了WiX的VS扩展程序,则可以使用VS编辑项目。(现代VS项目是MSBuild项目。)MSBuild随.NET一起提供(直到下一个版本,在那里它将成为单独的插件)。
因此,向导可以基于用户输入和插件数据生成WiX文件。它还可以构建MSI。您仍然可以使用Install Helper,但最好使用WiX的SQL Server自定义操作(如果适用于您的情况)以可靠地支持卸载和升级。
由于插件安装和配置数据中至少有一部分来自插件,因此您可以让插件项目生成它,以便随向导一起安装。 WiX支持将单独组件的信息放置在单独的文件中,因此您无需维护一个合并的文件供向导使用。如果信息很简单,则插件作者可以手动维护它。否则,可以在插件编辑时间或插件构建时间生成。在编辑时间,您可以使用T4模板(内容与C#代码混合)。在构建时间,您可以使用内联或编译的自定义MSBuild任务(用C#编写)。[.csproj文件是MSBuild项目。]同样,您的向导安装程序将获取生成的文件以及插件DLL并安装在运行向导的计算机上。
您还可以使用WiX来安装您的向导。如果您的向导是VSIX包,请使用WiX的VSIX自定义操作。该插件的Wix文件可能适用于向导安装程序和为用户生成的安装程序。

感谢您提供WiX工具包的建议。也许我没有很好地解释向导的想法,但在更新问题之前:向导会创建(或更新)一组VS项目,其中一个是安装助手,一个是安装程序,然后有一个或多个“有效负载”插件DLL。 - BradHards
好的,您的向导可以在解决方案中添加/维护WiX设置项目。这应该比维护Visual Studio安装程序项目容易得多。 - Tom Blodget

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接