使用 WiX 将参数传递给 Windows 服务的安装程序 Class
Pass arguments to Installer Class of Windows Service with WiX
我正在将 Windows 服务从 Visual Studio 2010 迁移到 VS2012,由于该服务不支持 Visual Studio 安装项目,我正在尝试重新创建我的安装项目使用 WiX。
在 VS2010 上,我使用用户界面中的标准文本框表单将一些参数传递给我的安装程序 Class,安装程序将使用此信息来实例化 Entity Framework 的 DbContext 并部署数据库ObjectContext.CreateDatabase() 方法。
以下是我如何在安装程序上执行此操作的摘录 Class:
public override void Install(System.Collections.IDictionary stateSaver)
{
base.Install(stateSaver);
string dataSource = string.IsNullOrEmpty(Context.Parameters["DataSource"]) ? "." : Context.Parameters["DataSource"];
// some more code...
}
是否可以使用 WiX 指定此参数?
我试图通过在WiX的Xml的"Argument"参数上传递参数来做到这一点,但安装程序似乎不接受它(它没有指责任何错误,但表现得好像我根本没有传递任何参数。
<ServiceInstall Id="ServiceInstaller"
Type="ownProcess"
Vital="yes"
Name="NFeConnectorService"
DisplayName="NFeConnector Service"
Description="Servico de Mensageria para NFe"
Start="auto"
Account="LocalSystem"
ErrorControl="ignore"
Interactive="no"
Arguments="/InitialCatalog="NFeConnector2" " />
我也试过以下语法但没有成功:
Arguments="/InitialCatalog=NFeConnector2"
Arguments="InitialCatalog=NFeConnector2"
有谁知道如何将此参数传递给我的安装程序 Class?
你不太可能让它发挥作用。问题是 Visual Studio 安装程序 classes 没有被 Windows 安装程序直接调用。有一个未记录的接口调用 C++ Dll,然后通过反射调用您的程序集和安装程序 class。 VS 生成对此 C++ Dll 的调用,传递一些与您的字符串连接的未记录参数。我不知道你试过什么,但除非你对这些调用进行逆向工程并包含 C++ Dll,找出 Dll 入口点和参数,否则它将无法工作。
简短的回答是不用打扰。安装程序 classes 只是 Visual Studio 的东西,这就是它们不迁移的原因。 WiX 支持 C# 自定义操作(参见 WIX - Adding a C# custom action code 之类的内容)并远离安装程序 classes。
我正在将 Windows 服务从 Visual Studio 2010 迁移到 VS2012,由于该服务不支持 Visual Studio 安装项目,我正在尝试重新创建我的安装项目使用 WiX。
在 VS2010 上,我使用用户界面中的标准文本框表单将一些参数传递给我的安装程序 Class,安装程序将使用此信息来实例化 Entity Framework 的 DbContext 并部署数据库ObjectContext.CreateDatabase() 方法。
以下是我如何在安装程序上执行此操作的摘录 Class:
public override void Install(System.Collections.IDictionary stateSaver)
{
base.Install(stateSaver);
string dataSource = string.IsNullOrEmpty(Context.Parameters["DataSource"]) ? "." : Context.Parameters["DataSource"];
// some more code...
}
是否可以使用 WiX 指定此参数?
我试图通过在WiX的Xml的"Argument"参数上传递参数来做到这一点,但安装程序似乎不接受它(它没有指责任何错误,但表现得好像我根本没有传递任何参数。
<ServiceInstall Id="ServiceInstaller"
Type="ownProcess"
Vital="yes"
Name="NFeConnectorService"
DisplayName="NFeConnector Service"
Description="Servico de Mensageria para NFe"
Start="auto"
Account="LocalSystem"
ErrorControl="ignore"
Interactive="no"
Arguments="/InitialCatalog="NFeConnector2" " />
我也试过以下语法但没有成功:
Arguments="/InitialCatalog=NFeConnector2"
Arguments="InitialCatalog=NFeConnector2"
有谁知道如何将此参数传递给我的安装程序 Class?
你不太可能让它发挥作用。问题是 Visual Studio 安装程序 classes 没有被 Windows 安装程序直接调用。有一个未记录的接口调用 C++ Dll,然后通过反射调用您的程序集和安装程序 class。 VS 生成对此 C++ Dll 的调用,传递一些与您的字符串连接的未记录参数。我不知道你试过什么,但除非你对这些调用进行逆向工程并包含 C++ Dll,找出 Dll 入口点和参数,否则它将无法工作。
简短的回答是不用打扰。安装程序 classes 只是 Visual Studio 的东西,这就是它们不迁移的原因。 WiX 支持 C# 自定义操作(参见 WIX - Adding a C# custom action code 之类的内容)并远离安装程序 classes。