Microsoft.Practices.Unityによる信じられないほどの冒険

AOPを使用することの可能性や利点についてではなく、プロジェクトでUnityを使用する個人的なケースについてです。

少しの背景


いくつかのクライアントアプリケーションの自動更新のニーズに対応するために、更新をチェックし、別のスレッドで更新を実行する独自のライブラリが作成されました。 クライアントでのライブラリの使用は最小限に抑えられます。

物語そのもの


そして、ある時点で、次のアップデートを適用した後。 オムスクの遠いクライアントが、アプリケーションを起動したときに奇妙な「ブレーキ」を経験し始めました。 プログラムは約30〜40秒間ハングし、その後正常に起動し、後で通常の速度で動作しました。
うーん...私はコードを見始めました。

シングルトンとして実装されたクラスがあります:

private static readonly UpdateManager instance = new UpdateManager(); /// /// ( ). /// Main(). static UpdateManager() { } private UpdateManager() { } public static UpdateManager Instance { get { return instance; } } * This source code was highlighted with Source Code Highlighter .
  1. private static readonly UpdateManager instance = new UpdateManager(); /// /// ( ). /// Main(). static UpdateManager() { } private UpdateManager() { } public static UpdateManager Instance { get { return instance; } } * This source code was highlighted with Source Code Highlighter .
  2. private static readonly UpdateManager instance = new UpdateManager(); /// /// ( ). /// Main(). static UpdateManager() { } private UpdateManager() { } public static UpdateManager Instance { get { return instance; } } * This source code was highlighted with Source Code Highlighter .
  3. private static readonly UpdateManager instance = new UpdateManager(); /// /// ( ). /// Main(). static UpdateManager() { } private UpdateManager() { } public static UpdateManager Instance { get { return instance; } } * This source code was highlighted with Source Code Highlighter .
  4. private static readonly UpdateManager instance = new UpdateManager(); /// /// ( ). /// Main(). static UpdateManager() { } private UpdateManager() { } public static UpdateManager Instance { get { return instance; } } * This source code was highlighted with Source Code Highlighter .
  5. private static readonly UpdateManager instance = new UpdateManager(); /// /// ( ). /// Main(). static UpdateManager() { } private UpdateManager() { } public static UpdateManager Instance { get { return instance; } } * This source code was highlighted with Source Code Highlighter .
  6. private static readonly UpdateManager instance = new UpdateManager(); /// /// ( ). /// Main(). static UpdateManager() { } private UpdateManager() { } public static UpdateManager Instance { get { return instance; } } * This source code was highlighted with Source Code Highlighter .
  7. private static readonly UpdateManager instance = new UpdateManager(); /// /// ( ). /// Main(). static UpdateManager() { } private UpdateManager() { } public static UpdateManager Instance { get { return instance; } } * This source code was highlighted with Source Code Highlighter .
  8. private static readonly UpdateManager instance = new UpdateManager(); /// /// ( ). /// Main(). static UpdateManager() { } private UpdateManager() { } public static UpdateManager Instance { get { return instance; } } * This source code was highlighted with Source Code Highlighter .
  9. private static readonly UpdateManager instance = new UpdateManager(); /// /// ( ). /// Main(). static UpdateManager() { } private UpdateManager() { } public static UpdateManager Instance { get { return instance; } } * This source code was highlighted with Source Code Highlighter .
  10. private static readonly UpdateManager instance = new UpdateManager(); /// /// ( ). /// Main(). static UpdateManager() { } private UpdateManager() { } public static UpdateManager Instance { get { return instance; } } * This source code was highlighted with Source Code Highlighter .
  11. private static readonly UpdateManager instance = new UpdateManager(); /// /// ( ). /// Main(). static UpdateManager() { } private UpdateManager() { } public static UpdateManager Instance { get { return instance; } } * This source code was highlighted with Source Code Highlighter .
  12. private static readonly UpdateManager instance = new UpdateManager(); /// /// ( ). /// Main(). static UpdateManager() { } private UpdateManager() { } public static UpdateManager Instance { get { return instance; } } * This source code was highlighted with Source Code Highlighter .
  13. private static readonly UpdateManager instance = new UpdateManager(); /// /// ( ). /// Main(). static UpdateManager() { } private UpdateManager() { } public static UpdateManager Instance { get { return instance; } } * This source code was highlighted with Source Code Highlighter .
  14. private static readonly UpdateManager instance = new UpdateManager(); /// /// ( ). /// Main(). static UpdateManager() { } private UpdateManager() { } public static UpdateManager Instance { get { return instance; } } * This source code was highlighted with Source Code Highlighter .
  15. private static readonly UpdateManager instance = new UpdateManager(); /// /// ( ). /// Main(). static UpdateManager() { } private UpdateManager() { } public static UpdateManager Instance { get { return instance; } } * This source code was highlighted with Source Code Highlighter .
private static readonly UpdateManager instance = new UpdateManager(); /// /// ( ). /// Main(). static UpdateManager() { } private UpdateManager() { } public static UpdateManager Instance { get { return instance; } } * This source code was highlighted with Source Code Highlighter .


クライアントアプリケーションから呼び出しがあります。

  1. UpdateManager.Instance.InitializeNotifyIconForm();
*このソースコードは、 ソースコードハイライターで強調表示されました。


アヒル、あなたが電話すると、30秒で理解できない遅れが発生します。 トレースで識別
職場情報:0:Workplace.Workplace.InitializeNotifyIconメソッドの実行を開始します。 現在の時間:12/9/2011 2:57 p.m.

Krista.FM.Client.Workplace情報:0:Workplace.Workplace.InitializeNotifyIconメソッドは正常に完了しました。 使用時間-30154ミリ秒。 現在の時間:12/9/2011 02:18 p.m.

つまり 最初の呼び出しの前に、静的フィールドを初期化する必要があります。したがって、コンストラクターを呼び出す必要があります。 しかし、さらなる研究が示すように、設計者への最初の呼び出しは30秒後にのみ発生しました。

フレームワーク情報:0:Framework.UpdateManager..ctorメソッドの実行の開始現在の時間: 12/12/2011 02:16 PM

質問:この時点で何が行われていますか?


彼は、ブレーキをかける可能性のある新しいものが現れたことを思い出し始めました。 Microsoft.Practices.Unityライブラリを使い始めたことを思い出しました。

このライブラリにはデジタル署名があります。

アプリケーションの初期化中。 NET Common Language Runtime(CLR)は、証明書失効の署名済みアセンブリをチェックします。 これには当然、インターネットへのアクセスが必要です。 たとえば、ファイアウォールやネットワーク接続の欠如が原因でサーバーが利用できない場合、CLRは最終的にタイムアウトによって低下します。これには15〜30秒かかります。

ネットワークで見つかった可能な解決策。

Infragisticsのソリューション

1.ファイアウォールを設定し、ユーザーにインターネット接続を許可します。 すぐに姿を消し、多くの顧客がいます。原則として、彼らは彼らの権利を侵害しています。
2. [Internet Explorerツール]-[インターネットオプション]-[詳細設定]タブ-[証明書失効の確認]オプションを無効にします。 チェック済み-動作します。 ただし、オプションではありません。管理者権限が必要であり、新しいクライアントごとにこれを行うことを忘れないでください。 クライアント依存のソリューション。 炉内。
3.証明書をローカルにインストールします。 10〜15日間のみ有効です。 オプションが消えます。
4.署名されていないバージョンのdllを使用します。 Microsoft.Practices.Unityの場合、見つけられませんでした。 また、Infragisticsコンポーネントを使用しているため、長い間これを処理し、2つのバージョンのライブラリを提供しています。 ビンとビン署名
5.ソースをダウンロードUnityは、署名なしでライブラリを自然に再コンパイルしました。 動作します。 しかし、私たちのプロジェクトはまだUnity依存のプロジェクトを使用しています。 Microsoft.Practices.ServiceLocation.dll、Unity.AutoRegistration.dll。 それらを再コンパイルする必要があります。 まあまあ一般的なバージョン。
6.完成したdllからデジタル署名を削除しようとしました。 可能です。 しかし、どういうわけか退屈です。 まあまあのオプションですが、動作するかもしれません
7.そしてここに、解決策があります! NET 3.5では、証明書の検証を無効にするgeneratePublisherEvidence要素。 私はそれがうまくいくと信じています! configにのみ追加します:

  1. < 設定 >
  2. < ランタイム >
  3. < gneratePublisherEvidenceenabled = "false" />
  4. </ ランタイム >
  5. </ 設定 >
*このソースコードは、 ソースコードハイライターで強調表示されました。


後で、私のものに似た2つのストーリーを見つけました。

最初のケース
2番目のケース

これは簡単な安全ではありません。

Source: https://habr.com/ru/post/J134660/


All Articles