我正在尝试为现有应用程序编写一个插件(实际上是一个生成插件的可视化工作室模板向导)。作为插件安装的一部分,我必须将条目插入配置数据库。通常有多个DLL对应于功能的不同部分,有时每个都需要相同表中的条目,但通常具有不同的表条目组合。我需要从安装程序中添加这些内容。
出于政策原因,一切都在C#中。
我目前正在使用Visual Studio Installer(VS2010)来创建安装程序。我更喜欢使用可能安装在用户机器上的东西来保持模板/向导安装简单,但我可以(如果需要)捆绑/链式安装开源(或至少可自由再分发)的替代方案安装程序。
例如,要向应用程序添加菜单项,我必须将条目插入到几个表中。在过去,我通过使用从安装程序应用程序调用的安装程序帮助程序(有时是应用程序,有时是installer class)来完成此操作。在那个设计中,我会将需要添加到配置表中的设置嵌入到安装程序帮助程序中,然后执行SQL(通过C#:-))来实际执行添加。
问题在于,这导致将相同的信息重复到两个地方,并且在向导环境中它不是很易于维护或清理。我真的更喜欢从我可以在插件程序集上设置的某些属性中反省这些信息。
但是我遇到了第一步 - 我的Installer类如何通过此安装找出安装(或将要安装)的程序集?
我确实考虑过尝试将DLL列表嵌入到自定义安装程序属性中,但这也很难从我的插件向导中生成。理想情况下,我可以注册一些现有的事件,或者我可以阅读的现有属性,但我还没有发现它。
答案 0 :(得分:3)
您可以使用Windows Installer API转储给定MSI包中包含的所有DLL。
在C#中,有各种库或示例代码可用于执行此操作。
在这里,我将使用开源Wix toolset项目的DLL。因此,您只需要下载二进制文件(而不是wix安装程序),创建项目并在此二进制文件目录中添加对Microsoft.Deployment.WindowsInstaller.dll
和Microsoft.Deployment.WindowsInstaller.Package.dl
l的引用
这是一个示例程序,它写出了包的所有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);
}
}
}
}
}
答案 1 :(得分:2)
我不清楚在运行向导和看到.msi之间会发生什么。 (向导的输出是VS项目还是.msi本身[在这种情况下,最终用户根本不需要VS]?)但是,让我们开始......
似乎您的瓶颈是Visual Studio Installer。这也是一个定时炸弹,因为它会死于VS2010。许多项目(例如Visual Studio本身)都使用WiX工具集。对于Visual Studio和SharpDevelop用户,WiX“很可能安装在用户的机器上”并且是“开源的”。它可以作为您可以包含在向导中的二进制文件提供,也可以从用户或用户为NuGet,Chocolatey或exe安装完整产品(包括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文件用于向导安装程序和为用户生成的安装程序的插件。