我正在开发一个visual studio安装项目。到目前为止,除卸载外一直都很好。该程序没有创建自己的卸载程序,而是卸载功能在setup.msi中。所以我需要做的是在安装过程中,我需要将正在运行的setup.msi复制到[TARGETDIR]。我能想到的最简单的方法是使用自定义操作。我对自定义操作很遗憾,我不明白他们去哪里,每次我尝试编写一个,它充满了错误。看看其他问题和答案,我想出了以下内容:
[RunInstaller(true)]
public partial class CustomInstaller : System.Configuration.Install.Installer
{
public override void Install(System.Collections.IDictionary stateSaver)
{
base.Install(stateSaver);
string path = this.Context.Parameters["targetdir"];
// Do something with path.
}
}
但我不明白。我看到它是如何通过customactiondata传递的targetdir。但是,RunInstaller是未知的,也不是System.COnfiguration.Install.Installer。我应该把这个.cs文件放在哪里使它工作?很困惑。
答案 0 :(得分:1)
此类应放在您的应用程序项目中。我相信它可以包含在任何项目中,其DLL由安装项目打包,但通常最有意义的是将它放在应用程序项目中。
确保您的应用程序项目引用System.Configuration.Install.dll。这将解决对Installer
。
RunInstaller
位于System.ComponentModel
命名空间(System.dll)中,因此请确保在类文件的顶部有using System.ComponentModel
语句。
此问题可能有助于您更多地了解自定义操作:
Why won't my Setup Project Perform my Custom Registration Process
答案 1 :(得分:1)
这可能会帮助您入门,但它不包括安装程序类。
https://www.simple-talk.com/dotnet/visual-studio/getting-started-with-setup-projects/
错误2835是一个虚假错误,与尝试显示一个对话框有关,可能是错误对话框,所以它掩盖了出错的地方,很可能就是你的代码。
使用msiexec / I / l * v创建日志,并在2835之前查找您的错误。
您将targetdir值传递给自定义操作(如参数列表),因此您要说/ targetdir =“[TARGETDIR] \”这是区分大小写并包括括号。它很挑剔,因为它与其他参数合并。
请注意您的代码未在应用程序上下文中运行。这是来自运行系统帐户和sysetm32工作目录的msiexec进程的调用。这意味着需要指定完整路径,并且任何特定于配置文件的项目(如桌面,用户配置文件位置)的使用都将失败。