我有一个 C# .net 4 应用程序,我开始创建安装程序。
安装的程序运行良好,但我的客户希望应用程序以窗口启动(它是一个“始终位于顶部”的工具栏,可帮助他们管理调用)。
我想创建一个“类安装程序”,并在其中插入一个注册表项。
我有两个问题:
第一:如何找到可执行路径?它可以在安装之间更改。我在某处找到了一个 Application.ExecutablePath,但它似乎位于 Application.Window.Forms 中,所以我认为它与 WPF 不兼容
其次:我需要在本地机器的注册表中插入这个键值。 Windows 安装程序中是否有一种方法可以指定用户必须具有管理员权限?
这是我开始的代码:
RegistryKey rkApp = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true);
rkApp.SetValue("CstStart", ???);
非常感谢您的帮助!
编辑:我发现我可以将一些数据传递给我的自定义操作,其中:
/DIR="[TARGETDIR]\"
在 CustomActionData 中。
一般都说可以通过
this.Context.Parameters["DIR"];
但是....似乎在我的安装程序类中,this.Context 为 null :(
EDIT2:上下文为空,因为我在构造函数中执行此操作,我现在在 this.AfterInstall 事件中执行此操作,现在我得到一个上下文,它似乎包含一个 var“assemblypath”,它恰好包含我需要的路径。
最佳答案
我的假设是您在此处使用安装项目......
执行此操作的一种方法 - 我并不是说它是最好的,但它可能是最简单的 - 是执行以下操作:
在“文件系统”选项卡中,右键单击“目标机器上的文件系统”、“添加特殊文件夹”、“用户的启动文件夹”,这样的文件夹就会出现在列表中。接下来,获取项目输出的快捷方式(通过右键单击)并将该快捷方式拖到“启动”文件夹中。
最后,由于您希望所有用户都这样做,请进入“部署项目属性”并将“InstallAllUsers”设置为 true。
现在,这种方法有一个警告,因为应用程序不会在 Windows 启动时启动,而是在有人登录时启动。根据您对项目(一个 UI 应用程序)的描述,这可能没问题。
如果您真的想破解注册表,您可以考虑创建一个自定义操作 dll。您可以在这里编写几乎所有您喜欢的东西,并且在安装过程结束时,安装程序将调用您的 dll,以便您可以做您的事情。您可以将可执行文件的路径之类的东西作为参数传递给 dll(您可以从安装程序对话框中获取,而不是从任何对象中获取)。我不会深入讨论这个细节,因为网络上肯定有很多关于这方面的内容。
您应该知道,您可以传递到 dll 中的信息量是有限的 - 如果内存可用,可能低至 256 个字符。您可能只需要一条路径就可以了,但是当您开始做更多事情时……
关于检测用户是否是本地管理员,这有点棘手,因为自定义操作 dll 在安装结束时而不是开始时运行 - 所以您可以编写代码来找出当前用户在哪个组中,但是您很可能在该代码运行之前就已经炸毁了。我不相信 - 至少在 Microsoft 安装项目中 - 有可能知道这一点。
关于c# - 设置程序必须在启动时从安装程序运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5092477/