【发布时间】:2011-02-15 19:41:16
【问题描述】:
首先,是的,我知道 VS 安装项目是邪恶的。这是我必须处理的。我也看到了几个相关的问题,但它们要么没有得到回答,要么与我的情况不够接近,无法得到答案(或者他们喋喋不休地谈论 VS 设置项目的弊端和 WiX 的奇迹)。
我的应用程序有一个安装项目。复制文件效果很好,但是复制文件后我需要执行两个自定义操作。我创建了一个安装程序类并将其设置为安装项目中的自定义操作,它的骨架(没有工作,只是显示一个对话框,以便我可以附加调试器并环顾四周)工作得很好。然后,我发现我需要将参数从 MSI 传递给我的自定义操作,以便我可以通过安装程序类的 Context 属性访问它们。
这是安装程序类的当前代码(一些名称已更改以保护无辜者)。它基本上什么都不做,只是在正确的时间显示一个对话框(在复制文件之后但在提交安装之前):
namespace MyApp.Install.CustomSetup
{
[RunInstaller(true)]
public partial class MyAppCustomInstallActions : System.Configuration.Install.Installer
{
public MyAppCustomInstallActions()
{
InitializeComponent();
}
protected override void OnAfterInstall(IDictionary savedState)
{
try
{
base.OnAfterInstall(savedState);
if (MessageBox.Show(
"Custom Action OnAfterInstall successfully integrated. You can attach a debugger if desired. Do you wish to perform the custom actions?",
"DEBUG", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) return;
SetEditablePermissionOnFolder(savedState);
SetApplicationSettingsFromWizard(savedState);
}
catch (Exception ex)
{
Context.LogMessage(ex.ToString());
throw;
}
}
private void SetApplicationSettingsFromWizard(IDictionary savedState)
{
//TODO: Implement
}
private void SetEditablePermissionOnViewerFolder(IDictionary savedState)
{
//TODO: Implement
}
}
}
计划是让自定义操作生效,然后取出对话框并执行此操作。
这是安装项目自定义操作的安装操作的 CustomActionData 字符串:
/phonenumber=[phonenumber] /thirdpartyinstallpath1="[thirdpartyinstallpath1]\" /thirdpartyinstallpath2="[thirdpartyinstallpath2]\" /thirdpartyinstallpath3="[thirdpartyinstallpath3]\"
如果我不使用这个参数字符串也可以,但是我没有参数。如果我确实指定了这个字符串,安装程序会在我自己的对话框出现之前失败,出现两个错误:"Exception occurred while initializing the installation: Could not load file or assembly 'file:///C:\Windows\SysWOW64\Files' or one of its dependencies. The system cannot find the file specified" 和 "Error 1001. Could not find file C:\Program Files (x86)\MyCompany\MyApp\MyApp.Install.CustomSetup.InstallState"。
我做错了什么?我做错什么了吗?是否有不需要我使用其他框架重新创建安装程序的解决方案?
编辑:我发现删除除电话号码参数之外的所有内容并将 [PHONENUMBER] 放在引号中,可以传递该参数。但是,我不能通过任何目录路径;我用 [INSTALLDIR] 尝试了几个博客和演练中所说的那样做,没有骰子。
【问题讨论】:
-
必须说,VS Setup 项目最适合我,不仅仅是公司、产品数量等等。注意事项?当然,但即使是经过验证的科学也随之而来,我也每天都过着自己的生活。
-
.InstallState 文件在我使用“设置”模板时也丢失了,切换到“设置向导”模板时,.InstallState 文件将不再丢失。完成“设置向导”后,我仍然可以自定义项目,因为它是使用“设置”创建的。
标签: c# .net installation custom-action