【问题标题】:C#: Directory.getCurrentDirectory() when launching from BrowserC#:从浏览器启动时的 Directory.getCurrentDirectory()
【发布时间】:2012-07-03 16:13:10
【问题描述】:

我目前正在为我的应用程序开发自动更新程序。 (结合安装程序、更新程序和删除工具)

我想自动设置所有的东西:

  • 开始菜单项
  • C:\Program Files\ 中的文件夹
  • 应用数据中的配置文件夹(取决于漫游/本地)
  • “程序和功能”中的软件删除条目
  • 桌面快捷方式。

这一切都很好。要写入程序文件和注册表,该工具需要管理员权限 ofc。因此,在选择了所需的软件后,我添加了 AppLauncher 的“重新启动”。 就像这样:

ProcessStartInfo pi = new ProcessStartInfo(Directory.GetCurrentDirectory() + @"\AppLauncher.exe");
        pi.Verb = "runas";
        pi.Arguments = "install " + this.appItem.APID;

        Process p = new Process();
        p.StartInfo = pi;
        try
        {
            p.Start();
            Application application = Application.Current;
            application.Shutdown();
        }
        catch (Exception ex)
        {
            MessageBox.Show("Unable to install the application.\n\n" + ex.ToString(), "Error", 
            application.Shutdown();
        }

此步骤也非常有效,如果用户将 AppLauncher.exe 保存在文件夹中的某个位置并通过双击启动它。

如果用户决定从浏览器中点击“运行”,安装程序会遇到显示的异常,说“找不到 AppLauncher.exe”。我假设,从浏览器启动文件将设置一个不同的工作目录,因此

Directory.GetCurrentDirectory()

不会返回文件所在位置的适当值。 如果用户决定给文件另一个名称,它也可能不起作用。

那么,我能做些什么呢?

是否有类似 File.GetCurrentFile() :P

【问题讨论】:

标签: c# process uac administrator


【解决方案1】:

替换

Directory.GetCurrentDirectory() + @"\AppLauncher.exe"

System.Reflection.Assembly.GetEntryAssembly().Location

(如果你

但是,最好不要重新发明自行车,而是使用已实现所有集成功能并已解决所有错误的可用安装程序解决方案之一。

例如:ClickOnceWiX

【讨论】:

  • 为了这个目的利用反射是不是有点矫枉过正?
  • 它内置在 .NET 中,所以我怀疑它会对性能产生一些影响。 OP想要获取当前正在执行的程序路径;这就是GetEntryAssembly() 的用途。 PS:再仔细看问题,正是OP要找的(“File.GetCurrentFile()”)。
  • 其实包含当前执行代码的程序集是通过System.Reflection.Assembly.GetExecutingAssembly()获取的
  • @Alex OP 想知道他们的AppLauncher.exe 的路径,而不是包含当前执行代码的 .dll。
  • +1 因为它是正确的并且建议不要重新发明轮子:)
猜你喜欢
  • 2015-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多