C#のアプリの背景/自動/サイレントダウンローダ/インストーラを書くことに関する質問
-
12-11-2019 - |
質問
背景:
私はWebにアクセスしてそれに関連付けられているDLLファイルをダウンロードする必要があるメインアプリケーションを持っています(私達のサーバー上にあるものにあります)。それは本当に "C:\ Program Files \"でこれらのDLLファイルをアプリケーションフォルダにダウンロードできる必要があります。過去には、私がWebから欲しいファイルをダウンロードするためにSystem.Net.WebClient
を使用しました。
問題
私は過去にデータをダウンロードし、ユーザーのハードドライブ上のファイルに保存するのに問題がありました。私はこれが機能しないことを言っているユーザーの多くの報告書を取得し、それは一般的にプログラム内のユーザー権利の問題のためです。
プログラムのユーザー権限の問題である場合は、すべてのユーザーがWeb上の正確なファイルの場所に移動してダウンロードしてから手動で保存してください。
私はこのFirefox Pluignのアップデート、Flash Player、Java、Adobe Readerなどで私がダウンロード/インストールを見た他のすべてのプログラムのように機能してほしいのです。これらの作業はすべてヒッチなしです。
質問
ダウンローダプログラムをプログラムファイルフォルダに特殊権限にするために使用する必要があるコードはいくつかありますか?これを行うことができますか?私が使うべきであるより良いクラスやライブラリはありますか?スレッドやデータをダウンロードするために他の何かを使用するなど、私が取るべきファイルをダウンロードするためのさまざまなアプローチはありますか?
ここでの助けが高く評価されています。ライセンスの問題のために、もちろんマイクロソフト以外の場合は、サードパーティのアプリ/ライブラリから離れて滞在しようとしますが、履歴問題が発生しているが、まだ私の方法を送ってください。
再び、他のプログラムは権利の問題とダウンロード機能を持つように見えます。私はこの同じ機能が欲しいのです。
解決
通常の方法は次のようになります:
- あなたのアプリケーションは更新が必要であることを検出します。
- アプリケーションは別の(アップデータ)アプリケーションを起動します。これは、必要なファイルをダウンロードして
Program Files
にインストールします。このアップデータアプリケーションは管理者権限で実行されなければなりません(すなわち、Vista / Win7のUAC標高を促す)。これを確実にする最も簡単な方法は、http://www.aneef.net/2009/06/29/06/29/06/29/06/29/06/29/06/29/06/06/29/06/06/29/06/06/29/japplication-managed-code/ "rel=" nofollow ">そのアップデータアプリケーションにマニフェストを追加するにアプリケーションを追加するUACが有効な管理者である場合、Point 2は承認されなければならないUACプロンプトが表示されます(Firefox / Acrobat / etcの場合も同様です。更新者)。ユーザーが管理者ではない場合、彼は管理者の資格情報を要求されます。 (これは良いことです。管理者だけがすべてのユーザーにインストールされているアプリケーションをアップグレードすることを許可されるべきです。)
あなたのアップデータアプリケーションは特別な方法で書かれる必要はありません:それは以前のように
System.Net.WebClient
を使うことができます。アプリケーションマニフェストは、Program Files
への書き込みのために必要な産業を要求するようにします。この問題(UAC標高なしで管理者によって作成可能ではない)は、プログラミング言語の制限ではなくオペレーティングシステム機能であるため、「別のライブラリを使用する」とは、この問題を解決することはありません。アプリケーションがVista / Win7で実行され、
Program Files
に書き込む場合は、に書き込みます。はUAC標高を必要とします。
他のヒント
ビットサービスをチェックしてください:
プログラムファイルへの書き込みディレクトリには、Vista / Win7上のUAC標高(それが有効な場合)が必要です。このコードのサンプルを参照してください。> http://msdn.microsoft.com / ja-us / library / aa970890.aspx
本当に、それが誤って重要なプログラムファイルを上書きする危険性がないより適切な場所に書くようにあなたのアプリを設計することについて考えてください。
http://netsparkle.codeplex.com/ 。非常に成功したMac Sparkle Frameworkのポート http://sparkle.andymatuschak.org/
プログラムファイルに参加する必要がありますか?アプリケーションにも同様の問題があり、最初にインストールされていないアセンブリを解決するためのクラスを作成しました。現在のアプリケーションドメインのAssemblyResolveイベントに解決方法を追加した場合、これはシームレスになる可能性があります。
AppDomain.CurrentDomain.AssemblyResolve+= AssemblyResolve;
public Assembly AssemblyResolve(object sender, ResolveEventArgs args)
{
//try to get locally
//try to download
return assembly;
}
. それをしないでください。
理論的には簡単に行うことができます。管理者権限で実行される別のアプリを昼食してください - 設定でこれらを要求することができます。アップデータアプリでは、Secure(SSL)のWebサイトに接続し、必要なものをダウンロードしてダウンロードしたファイルをダウンロードする必要があります。
これは、更新が可能なClickonceまたは他のWebインストーラを使用して簡単に解決できます。
あなたがしないことは、未確認のソースからの不安DLLをダウンロードして実行するだけです。