【问题标题】:C# Setup Project run after install安装后运行 C# 安装项目
【发布时间】:2016-08-11 01:07:53
【问题描述】:

大家好,我是论坛的新手,也正在编程,需要一些关于项目的帮助。

所以我最近开始开发一个程序,首先必须在 Registry => Environment => Path 末尾添加它的路径。 对于这项工作,我创建了项目(MainLogic),其中包含一个执行该工作的类(程序),安装程序类包含下面的这些事件并配置了安装项目。 SOURCE

    public InstallerClass1()            
    {            
        this.Committed += InstallerClass1_Committed;
        this.Committing += InstallerClass1_Committing;
    }

    private void InstallerClass1_Committing(object sender, InstallEventArgs e)
    {
        //Console.WriteLine("");
        //Console.WriteLine("Committing Event occurred.");
        //Console.WriteLine("");
    }

    private void InstallerClass1_Committed(object sender, InstallEventArgs e)
    {
            Directory.SetCurrentDirectory(Path.GetDirectoryName
            (Assembly.GetExecutingAssembly().Location));
            Process.Start(Path.GetDirectoryName(
              Assembly.GetExecutingAssembly().Location) + "\\MainLogic.exe");
    }  

程序已正确安装,但我在安装后调用的 MainLogic.exe 文件导致错误并且无法启动。例外是 MainLogic.Program.Main(String[] args) 的空引用

这是一张更好理解的图片 -

有没有办法避免这种异常,或者你能给我另一个可行的方法。

*** 这是我找到的。我可以执行创建和输入文件。在控制台上书写。可能很多其他的东西都没有问题。但是当尝试执行我实际上必须使用的代码时...

    Registry.CurrentUser.OpenSubKey("Pass Key", RegistryKeyPermissionCheck.ReadWriteSubTree).SetValue("Finaly", "Done");
    Registry.CurrentUser.Close();

...发生了我上面描述的异常。有什么建议吗?


所以所有这些“练习”的主要原因是因为我想在我的应用程序中实现 ffmpeg。 我猜你听说过 ffmpeg(一个在命令提示符下工作的视频/音频处理程序)。 所以我正在做的是在我的项目中实现它,以便从视频文件中提取 mp3,但我想让它更加用户友好,以便用户可以通过 GUI 传递命令,然后我的代码应该从那里完成其他工作。所以 ffmpeg 通过命令提示符工作(我知道有一个包装器,但我对所读到的内容不太满意)但首先你必须将他的路径添加到注册表中的 Path 值。这就是我的问题所在。

也许这对你来说听起来很愚蠢,但你知道..当你开始做某事时,一直坚持下去。

【问题讨论】:

  • 可以使用安装程序本身操作注册表。
  • 应该是这样,因为设置完成后程序可能不会以管理员权限运行。
  • 异常是在你的 main 中抛出的。看看你在那里做什么。
  • @SarveshMishra 这是真的,但你只能在那里添加新的键和值。我想要做的是使用我在 Installer 类中获得的当前安装的程序路径来编辑路径的值数据。用你建议的方式操作似乎是不可能的。
  • @ThorstenDittmar 那么有没有办法在提交事件中以管理员身份运行它?

标签: c# installation project


【解决方案1】:

当然,如果您可以添加异常处理并查看出现了什么问题,但无论如何您都不需要。尝试直接在安装程序中设置注册表项

[RunInstaller(true)]
public partial class Installer1 : Installer
{
    public override void Install(IDictionary stateSaver)
    {
        base.Install(stateSaver);

        const string key_path = "SOFTWARE\\YourCompany\\YourApplication";
        const string key_value_name = "InstallationDirectory";

        RegistryKey key = Registry.LocalMachine.OpenSubKey(key_path, Microsoft.Win32.RegistryKeyPermissionCheck.ReadWriteSubTree);

        if (key == null)
        {
            key = Registry.LocalMachine.CreateSubKey(key_path);
        }

        string tgt_dir = "someDirectory";

        key.SetValue(key_value_name, tgt_dir);

    }

如果您想更改路径环境变量,请在此处设置密钥。您可以简单地添加一个新变量或查找现有变量(包括值),例如使用 Registry.GetValue MSDN-Link

用户变量

HKEY_CURRENT_USER\Environment

系统变量

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment

【讨论】:

  • 如果我想检查 MSI 以查看它会做什么注册表更改?
  • 您的意思是如果 uinstaller 想要检查现有的 reg 值?您可以轻松做到这一点.. 还是您的意思有所不同?
  • 通过微星的检查,我的意思是分析微星的内容。如果在自定义操作中操作注册表,则无法提前检测到这些。如果某件事可以以更简单的方式透明而轻松地完成,那为什么还要让这个过程复杂化呢。
  • @MarcWittmann 我尝试了你的方法,但更简化了 Registry.CurrentUser.OpenSubKey("Pass Key", Microsoft.Win32.RegistryKeyPermissionCheck.ReadWriteSubTree).SetValue("Finaly", "Done");再次抛出异常,但这次程序没有完成安装。在 Commit 方法中尝试了相同的操作 = 相同的结果。
  • 只需在您的注册表处理和消息框之前包含一个尝试捕获,其中 nullPointer 来自是的,取决于框架版本,您可以简单化它..只是想给您一个提示
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多