C# 关于在C语言中为应用程序编写后台/自动/静默下载程序/安装程序的问题#

C# 关于在C语言中为应用程序编写后台/自动/静默下载程序/安装程序的问题#,c#,download-manager,silent-installer,C#,Download Manager,Silent Installer,背景: 我有一个主应用程序,它需要能够访问web并下载与其相关联的DLL文件(我们编写的、位于服务器上的DLL文件)。它确实需要能够将这些DLL文件下载到“C:\Program files\”中的应用程序文件夹中。在过去,我使用System.Net.WebClient从网上下载我想要的任何文件 问题 过去我在下载数据和保存到用户硬盘上的文件时遇到了很多麻烦。我收到许多用户的报告说,这不起作用,通常是因为程序中的用户权限问题 在程序用户权限出现问题的情况下,每个用户都可以访问web上的确切文件位置

背景:
我有一个主应用程序,它需要能够访问web并下载与其相关联的DLL文件(我们编写的、位于服务器上的DLL文件)。它确实需要能够将这些DLL文件下载到“C:\Program files\”中的应用程序文件夹中。在过去,我使用
System.Net.WebClient
从网上下载我想要的任何文件

问题
过去我在下载数据和保存到用户硬盘上的文件时遇到了很多麻烦。我收到许多用户的报告说,这不起作用,通常是因为程序中的用户权限问题

在程序用户权限出现问题的情况下,每个用户都可以访问web上的确切文件位置,下载文件,然后手动将其保存到正确的位置

我希望它能像我在这个版本中看到的所有其他下载/安装程序一样工作(即Firefox Pluign更新、Flash Player、JAVA、Adobe Reader等)。所有这些工作都顺利进行

问题
是否需要使用一些代码来授予我的下载程序对program Files文件夹的特殊权限?我能这样做吗?有没有更好的课程或图书馆我应该使用?我应该采用不同的方法下载文件,例如使用线程或其他方法下载数据吗

这里的任何帮助都是感激的。如果可能的话,我想尽量远离第三方应用程序/库,当然,由于许可问题,微软除外,但我仍然会以我的方式发送任何建议


同样,其他程序似乎已经解决了权限问题和下载功能。我想要同样的功能。

写入程序文件目录需要Vista/Win7上的UAC提升(如果用户已启用)。有关如何提示用户输入权限,请参见此代码示例:


确实如此,请考虑设计您的应用程序,使其写入到更合适的位置,这样就不会有意外覆盖关键程序文件的风险。

试试看。非常成功的Mac Sparkle框架的一个端口。

查看BITS服务:

不要这样做

理论上这很容易做到。您只需使用另一个应用程序,该应用程序以管理权限运行-您可以在配置中请求这些权限。在updater应用程序中,您只需连接到安全(ssl)网站,下载所需的一切,下载的文件必须经过加密签名

使用ClickOnce或其他能够更新的web安装程序也可以轻松解决此问题


您不应该只从未经验证的源下载不安全的DLL并执行它们。

它真的需要在程序文件中吗?我在一个应用程序中遇到了类似的问题,我们编写了一个类来解析未安装的程序集,方法是首先尝试从%usersprofile%的子文件夹中加载程序集,然后尝试下载。如果将resolve方法添加到当前应用程序域的AssemblyResolve事件中,这将是无缝的

    AppDomain.CurrentDomain.AssemblyResolve+= AssemblyResolve;
    public Assembly AssemblyResolve(object sender, ResolveEventArgs args)
    {
         //try to get locally

         //try to download
         return assembly;
    }

通常的做法如下:

  • 应用程序检测到需要更新
  • 您的应用程序启动另一个(更新程序)应用程序,该应用程序将下载所需文件并将其安装到程序文件中。此更新程序应用程序必须以管理权限运行(即在Vista/Win7中提示UAC提升)。确保这一点的最简单方法是
  • 如果用户是启用UAC的管理员,第2点将导致出现UAC提示,必须接受该提示(请注意,Firefox/Acrobat/etc.更新程序也是如此)。如果用户不是管理员,将要求他提供管理员凭据。(请注意,这是一件好事:应该只允许管理员升级为所有用户安装的应用程序。)

    您的更新程序应用程序不需要以特殊方式编写:它可以像以前一样使用
    System.Net.WebClient
    。应用程序清单将确保它请求写入
    程序文件所需的预许可


    请注意,此问题(
    程序文件
    不可由管理员在没有UAC提升的情况下写入)是一个操作系统功能,而不是编程语言限制,因此您不会仅通过“使用其他库”来解决此问题。如果您希望应用程序在Vista/Win7上运行并写入
    程序文件
    ,则需要UAC升级。

    是的。。。这是一个好问题。在Mac电脑上,我会使用Sparkle,但我很好奇是否有类似于为.NET开发的东西。在这种情况下,单击一次是最好的选择。按一下就可以了。每次应用程序启动时,它都会检查服务器是否有更新,并自动更新应用程序或文件。@Shiv:ClickOnce不会安装到
    程序文件中,即它只为当前用户安装应用程序。Adobe Reader和JAVA等程序将文件安装到哪里?我想他们下载了文件并安装到了“程序文件”中的文件夹中。啊,对不起,我以为你在下载文件。对于为您自己的应用下载DLL,程序文件很有意义。这里的重要一课是从完全启用UAC的非管理员帐户进行开发(或至少测试)。您可以下载DLL的另一个位置是%AppData%的子文件夹。但是,这些信息是特定于您的用户配置文件的。+1对于“是操作系统功能,而不是编程语言限制”,我对此进行了大量研究,这是最好和最广泛使用的方法。