11

最近、.NET ポジションの面接を受けました。尋ねられた質問のうち、私は 1 つの質問に答えるのに本当に苦労しました。誰かがこれについて私を助けてくれることを願っています。

シナリオ (質問): アプリケーション (winform/wpf UI アプリケーションである可能性があります) の最初のリリースは既にクライアントに提供されており、アプリケーションの使用を開始しました。しかし残念なことに、QA チームはその後、現在のリリースに重大な問題を発見しました。ここでの課題は、アプリケーションを強制的に再起動することなく、パッチ (修正) を送信して適用できるようにすることです。アプリケーションは、パッチを適用するために再起動できないリアルタイム アプリケーションであることが前提です。

個人的には、パッチの適用中に実行中のアプリケーションに影響を与えない説得力のある答えを出すのに本当に苦労しました。

答え:

これまでにご協力いただきありがとうございました。この問題の解決策を得ることができました。これがインタビュアーが尋ねたものかどうかはわかりません。それにもかかわらず、Microsoft の ClickOnce について読んで嬉しく思いました。

4

4 に答える 4

4

現在実行中の実行可能ファイルについては、かなり行き詰まっています。メモリ内で実行されているプロセスを適切に変更することはできません。

ただし、DLL からロードされたものははるかに柔軟です。アセンブリは実行時に動的に読み込むことができ、1 つのアプリケーション内で複数の AppDomain を起動することができます。1つの解決策は、次のようなものかもしれません:

  • 実行可能ファイルは、すべての機能を DLL に渡すシン ラッパーです。
  • DLL 機能がロードされ、別の AppDomain を介して実行されます
  • パッチが必要な場合、新しい DLL がコピーされます (既存の DLL と並んで)。
  • 自動的に、またはユーザーの操作に応じて、新しい AppDomain が既存のものと一緒に開始され、新しいパッチが実行されます。
  • アプリの適切な時点 (たとえば、全画面表示の切り替えや時間指定の更新) で、新しい AppDomain が「ライブ」になります。
  • 古い AppDomain はシャットダウンされ、破棄されます

ただし、これは非常にレベルが高いです。現実的な状況では、キャッシュとライブ データ、およびその他の多くの考慮事項を備えた多層アプリを使用する可能性が非常に高くなります。たとえば、アプリケーションのフロントエンド ロジックをキャッシングまたはデータ処理部分から分離して、残りの部分に影響を与えずに 1 つの部分を切り替えることが必要になる場合があります。

正確な要件に応じて、特定の珍しい手法がここで役立つ可能性があります。高度なキャッシングにより、フロントエンドがデータを表示する機能を失うことなく、データ層をスワップアウトできます。コマンド キューイングまたは信頼性の高いメッセージング メカニズムにより、ビジネス層がスワップ アウトされている間も UI の応答性を維持でき、その後、新しいビジネス層がキューを処理できます。(論理的に)サーバーベースのアプリを想定している場合、各層の冗長性により、層の1つの冗長「サーバー」を更新しながら、他のサーバーが処理を続行できます...など.

于 2013-03-28T14:44:48.670 に答える
1

最初からこの要件がある場合は、アプリを 2 つの異なるアプリケーション (UI 部分と、個々のアトミック関数呼び出しですべての作業を行うサービス) に分けることができます。ほとんどの場合、バグはサービスにあるため、ユーザー エクスペリエンスを中断することなく、いつでもそのアプリケーションを置き換えることができます。

于 2013-03-28T14:51:05.160 に答える
0

まず、このアプリが xml、ini、または任意の形式のテキスト ベースのファイルなどの構成ファイルに依存しているかどうかを知る必要があります。その場合、現在のプロセスの範囲外で編集できる限り、パッチを構成として挿入できます。

最初の解決策が実行できない場合は、実行中のアプリケーションに信頼できる dll があるかどうか、および参照 dll を介して依存関係としてパッチを挿入すると、再起動が呼び出されるまで問題が一時的に修正されるかどうかを確認する 2 つ目の解決策があります。

于 2013-03-28T14:34:12.787 に答える
-2

古いファイルの名前を別の名前に変更し (ファイル名に「Old」を追加するなど)、新しい実行可能ファイルを同じファイル名の場所にコピーします。次回実行されると、新しい実行可能ファイルが実行されます。

于 2013-03-28T14:23:54.400 に答える