C#安装后运行安装项目

C#安装后运行安装项目,c#,installation,project,C#,Installation,Project,大家好,我是论坛的新手,也是编程高手,需要一些项目方面的帮助 所以我最近开始开发一个程序,首先必须在Registry=>Environment=>path的末尾添加它的路径。 对于此作业,我创建了一个项目(MainLogic),其中包含一个执行此作业的类(程序)、包含以下事件的安装程序类以及配置的安装项目 程序安装正确,但安装后调用的MainLogic.exe文件导致错误,无法启动。异常为MainLogic.Program.Main(字符串[]args) 以下是一张更好理解的图片- 有没有办法

大家好,我是论坛的新手,也是编程高手,需要一些项目方面的帮助

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

程序安装正确,但安装后调用的MainLogic.exe文件导致错误,无法启动。异常为
MainLogic.Program.Main(字符串[]args)

以下是一张更好理解的图片-

有没有办法避免这种例外,或者你能给我提供另一种可行的方法

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

    Registry.CurrentUser.OpenSubKey("Pass Key", RegistryKeyPermissionCheck.ReadWriteSubTree).SetValue("Finaly", "Done");
    Registry.CurrentUser.Close();
…发生了我上面描述的异常。建议


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


也许对你来说这听起来很愚蠢但是你知道。。当你开始做某件事的时候,一定要一直做下去。

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

[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

用户变量

HKEY_CURRENT_USER\Environment
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
系统变量

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

注册表可以使用安装程序本身进行操作。应该是这样,因为安装完成后,程序可能不会以管理员权限运行。异常会在主注册表中引发。看看你在那里做了什么。@SarveshMishra这是真的,但你只能在那里添加新的键和值。我想做的是用我在Installer类中得到的当前安装的程序路径编辑路径的值数据。按照您建议的方式操作似乎是不可能的。@ThorstenDittmar那么有没有办法在提交的事件中以管理员身份运行它?如果我想检查MSI以查看它将进行哪些注册表更改,该怎么办?您的意思是uinstaller是否想检查现有的注册表值?你很容易做到。。或者你的意思是不同的?通过检查MSI,我的意思是分析MSI的内容。如果在自定义操作中操纵注册表,则无法提前检测到这些操作。如果某些事情可以用更简单的方式透明、轻松地完成,那么为什么要使过程复杂化呢?@MarcWittmann我试过你的方法,但更简单,比如Registry.CurrentUser.OpenSubKey(“Pass Key”,Microsoft.Win32.RegistryKeyPermissionCheck.ReadWriteSubTree”).SetValue(“Finaly”,“done”);再次抛出异常,但这次程序没有完成安装。在提交方法中尝试了相同的事情=相同的结果。只需在注册表处理之前包含一个try catch,以及空指针来自的messageBox。是,根据框架版本,您可以简化它。。只是想给你一个提示