none
WPFで起動時にウィンドウで使用されるライブラリをロードしたい RRS feed

  • 質問

  • 現在 WPFにて起動と同時にウィンドウを表示せず IPCによるリクエストがあった場合のみ表示するプログラムを開発しています

    ウィンドウを2回目以降ロードする際は既に読み込まれているので問題ないのですが 初回実行時にどうしてもライブラリを読み込むために0.5秒~1秒ほどロスが発生してしまい困っています

    そのため起動時のOnStartupの時点でウィンドウで使用されているライブラリを読み込みを行いたいのですが 方法はありますでしょうか

    2014年10月26日 17:16

回答

  • typeof(ロードしたいアセンブリに含まれる何か適切な型)

    をスタートアップ時にダミーで実行しておくのが簡単かもしれません。

    • 回答としてマーク azutake 2014年10月27日 14:28
    2014年10月27日 0:50

すべての返信

  • そのライブラリとやらの作られ方次第としか言いようがないです。

    取りあえず、何で時間がかかってるのか調べてその処理をOnStartupに移すとかすればいいんじゃないですか。当たり前のことですが。
    • 編集済み Hongliang 2014年10月26日 22:12
    2014年10月26日 22:10
  • 最初に書いておくべきのことを書き忘れていました 申し訳ありません

    ロードを行いたいライブラリは.Netライブラリです

    プロセスを実行した時点ではウィンドウを表示されていないためロードされず ウィンドウの初回実行時にロードされるものを

    OnStartupの時点でロードさせたいと思っています

    ウィンドウのロード時に呼び出されるライブラリは下記です

    System.Runtime.Serialization.Formatters.Soap.dll

    PresentationCore.resources.dll

    UIAutomationTypes.dll

    PresentationFramework-SystemData.dll

    2014年10月26日 23:12
  • typeof(ロードしたいアセンブリに含まれる何か適切な型)

    をスタートアップ時にダミーで実行しておくのが簡単かもしれません。

    • 回答としてマーク azutake 2014年10月27日 14:28
    2014年10月27日 0:50
  • GCの対象になって困るようでしたら、以下のようにtypeofをGC.KeepAliveしておくと良いかもしれません。

    Good way to preload .NET assembly
    http://stackoverflow.com/questions/4895719/good-way-to-preload-net-assembly


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    2014年10月27日 1:56
    モデレータ
  • GCの対象になって困るようでしたら、以下のようにtypeofをGC.KeepAliveしておくと良いかもしれません。

    Good way to preload .NET assembly
    http://stackoverflow.com/questions/4895719/good-way-to-preload-net-assembly

    いや、TypeはGCの対象にはならないです確か…(MemberInfoはなったりしますが)

    というかまあ、アセンブリの事前ロード目的ですので、とにかくいったんロードが必要な状況を作ればいいだけのイメージです。

    ※別にGCされてもそれはそれで構わない。

    --追記

    なんかリンク先のサイトの書き込み、突っ込みどころが満載の気が…

    --追記2

    すみません、突っ込みどころというのは勘違いでした。

    GCの話じゃないですね、リンク先は。

    最適化でスルーされるのを確実に防止するなら、という話ですね。

    ※typeofは副作用があるので最適化されないと思いますが、不安ならやっとく方が確実とは言えます。

    • 編集済み なちゃ 2014年10月27日 2:45
    2014年10月27日 2:24
  • あ~、そうですね。アセンブリは手動でアンロードしないと自動でアンロードされないですし、GCとは全く関係ないですね。リンク先の回答の評価が良いんで、うっかり流してしまいました。ごめんなさい。ご指摘ありがとうございました。

    #そう言えば、クリスタルレポートの初回印刷が遅くて調べたこともあったんですが、必ず印刷するわけじゃないし、当時のメモリのことも考えてまっいいか放っておいたんですが、今の環境だとプレロードしとくべきかなぁ。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    2014年10月27日 3:04
    モデレータ
  • Hongliangさんと同意見で、本当にアセンブリの読み込みに時間がかかっているのかが気になります。0.5~1.0秒となると読み込みではなくて初期化処理ではと推測します。その場合、今議論されている単にアセンブリを読み込む方法を実行しても初期化処理が実行されない可能性もあり、何の解決にならないように感じます。
    2014年10月27日 4:31
  • スタートアップ時にtypeofでそれぞれダミーとして指定した結果 行いたい結果が得られました

    回答としてのマークが遅れて申し訳ありません

    回答していただいた皆様有難うございました

    2014年10月27日 14:31