DOBON.NETプログラミング道掲示板
(現在 過去ログ1 を表示中)

[ 最新記事及び返信フォームをトピックトップへ ]

■33183 / inTopicNo.1)  Ngen.exe(ネイティブ イメージ ジェネレーター)の使い方
  
□投稿者/ よっし〜 一般人(10回)-(2015/11/19(Thu) 10:25:58)
  • アイコン環境/言語:[OS : Windows 7 / 言語 : Visual Basic .NET / .NET Framework : 4] 
    分類:[.NET] 

    【解決したい問題】

    お疲れ様です。
    現在VB6で作成したシステムがあり、Windows10対応としてVB.NET2013にて再作成を行いました。
    ロジックや内容はそのままとし、VB.NETのツールや作法は別として、ソックリに作成しました。
    作成したExeを配布したのですが、ユーザに「新しくしたのに動作が遅くなった!」とのクレームの嵐になりました。
    色々と調べてみたのですが、グレープシティのActiveReportとSPREADを使用しているのですが、その動作が遅い様です。
    メーカのQ&Aをみると「Ngen.exe(ネイティブイメージジェネレーター)を使用することで改善できる可能性があります。」との
    内容がありました。
    【SPREADを配置したWindowsアプリケーションを実行した場合、初回起動に時間がかかる】
     http://www.grapecity.com/tools/support/technical/knowledge_detail.asp?id=33683
    そこで、作成した実行ファイルをNGENにかけてみると、「おぉ〜!」って言うぐらい早くなりました。
    前おきが長いですが、ここからが質問内容です。

    1.端末を再起動すると、また前の速度に戻ってしまいます。これって起動前の毎回実行する必要があるのでしょうか?
     私は、一回NGENに通すとコンパイルされたEXEに変更されるものと思っておりましたが・・・
    2.一部EXEにOCX(ActiveX)を使用しているのですが、端末によってはNGENで実行すると「ActiveXが見つかりません」とのエラーで
     コンパイル出来ない場合があります。コンパイル出来る端末はエラーは出るものの、そのまま処理が続行できます。
     出来る場合と出来ない場合とでは、どの様な点を注意すれば良いでしょうか?
    3.Ngenの記述はネットでも見当たるのですが、「デメリット」的な記述があまりありません。配布ExeをNGenした場合の副作用的な事が
     ありましたらお教えください。

    開発:Windows 7 SP1
    実行機(試験機):WindowsXP SP3 / Windows7 SP1 / Windows10
    開発:VB.NET2013 (Framework 4.0)

    以上、宜しくお教えくださいませ。
引用返信 削除キー/
■33184 / inTopicNo.2)  Re[1]: Ngen.exe(ネイティブ イメージ ジェネレーター)の使い方
□投稿者/ 774RR 一般人(2回)-(2015/11/19(Thu) 11:31:10)
  • アイコンVisual Studio **** コマンドプロンプトを起動して、その上で
    ngen install hoge.exe /verbose
    ngen uninstall hoge /verbose
    のように入力すると ngen が何をしているかがわかります。結局のところ

    ・ hoge.exe 自体には何の変化も与えず
    ・当該ローカルマシンのネイティブイメージキャッシュ
     端的には C:\Windows\assembly\NativeImagesなんちゃら 以下に hoge.ni.exe が生成される
    ということがわかります。

    1. 再起動しても hoge.ni.exe は消えません。つまりコンパイル済みのままです。
     マシンの再起動後 hoge.exe の1回目の起動が遅い理由はまだ読み込まれていない .NET Framework 自体を読みに行くためです。

    2. hoge.exe の使っている部品 (つまりその ActiveX 等) も同時に ngen しようとするためです。
     その部品の ngen は、できなくても問題ないです(実行時にロードすればよいだけなので)

    3. もし以下の手順を考えているなら無駄です。
    a. あなたの開発環境で生成した hoge.exe を、あなたのマシン上で ngen install hoge.exe する
    b. 生成された hoge.ni.exe もインストーラに含めて配布する
    ngen は ngen を実行したマシンに最適なネイティブイメージを生成します。
    客先マシンでは、あなたのマシン上の hoge.ni.exe は役に立ちません。

    正しくはインストーラが hoge.exe を客先マシンのインストール先に複写した後
    その客先マシン上でインストーラ自身が ngen install hoge.exe する、必要があります。

    デメリット
    ・インストーラが複雑になる
    ・ C:\Windows\assembly\NativeImages_ほにゃらら に hoge.ni.exe ファイルが生成される
     すなわち客先マシンの C ドライブの容量が余計に減る
    ・ hoge.exe を更新するとき(開発時、客先インストール時の両方の考察が必要)
     誤って古い hoge.ni.exe が使われないよう注意が必要

    ってあたりでしょうか。

引用返信 削除キー/
■33185 / inTopicNo.3)  Re[2]: Ngen.exe(ネイティブ イメージ ジェネレーター)の使い方
□投稿者/ よっし〜 一般人(11回)-(2015/11/19(Thu) 13:22:54)
  • アイコン774RRさん、早速のレス、有り難うございます。

    少しお聞きさせてください。

    > ngen は ngen を実行したマシンに最適なネイティブイメージを生成します。
    > 客先マシンでは、あなたのマシン上の hoge.ni.exe は役に立ちません。
    > 正しくはインストーラが hoge.exe を客先マシンのインストール先に複写した後
    > その客先マシン上でインストーラ自身が ngen install hoge.exe する、必要があります。

    今、手元の実験機で行っているのですが、実験機で「 ngen install hoge.exe」としても、
    cドライブに「hoge.ni.exe」がありませんし、「NativeImages」フォルダ自体がありません。
    これNgenのコンパイルに失敗しているのでしょうか??
    もし「hoge.ni.exe」があったとして、実際に「hoge.exe」では無く、「hoge.ni.exe」を起動すればいいのでしょうか?
    (まぁ、hoge.exeが更新されれば再コンパイルは必要として・・・)

    以上、お忙しいとは思いますが、もう少しおつきあいのほどお願いいたします。


    No33184に返信(774RRさんの記事)
    > Visual Studio **** コマンドプロンプトを起動して、その上で
    > ngen install hoge.exe /verbose
    > ngen uninstall hoge /verbose
    > のように入力すると ngen が何をしているかがわかります。結局のところ
    >
    > ・ hoge.exe 自体には何の変化も与えず
    > ・当該ローカルマシンのネイティブイメージキャッシュ
    >  端的には C:\Windows\assembly\NativeImagesなんちゃら 以下に hoge.ni.exe が生成される
    > ということがわかります。
    >
    > 1. 再起動しても hoge.ni.exe は消えません。つまりコンパイル済みのままです。
    >  マシンの再起動後 hoge.exe の1回目の起動が遅い理由はまだ読み込まれていない .NET Framework 自体を読みに行くためです。
    >
    > 2. hoge.exe の使っている部品 (つまりその ActiveX 等) も同時に ngen しようとするためです。
    >  その部品の ngen は、できなくても問題ないです(実行時にロードすればよいだけなので)
    >
    > 3. もし以下の手順を考えているなら無駄です。
    > a. あなたの開発環境で生成した hoge.exe を、あなたのマシン上で ngen install hoge.exe する
    > b. 生成された hoge.ni.exe もインストーラに含めて配布する
    > ngen は ngen を実行したマシンに最適なネイティブイメージを生成します。
    > 客先マシンでは、あなたのマシン上の hoge.ni.exe は役に立ちません。
    > 正しくはインストーラが hoge.exe を客先マシンのインストール先に複写した後
    > その客先マシン上でインストーラ自身が ngen install hoge.exe する、必要があります。
    >
    > デメリット
    > ・インストーラが複雑になる
    > ・ C:\Windows\assembly\NativeImages_ほにゃらら に hoge.ni.exe ファイルが生成される
    >  すなわち客先マシンの C ドライブの容量が余計に減る
    > ・ hoge.exe を更新するとき(開発時、客先インストール時の両方の考察が必要)
    >  誤って古い hoge.ni.exe が使われないよう注意が必要
    >
    > ってあたりでしょうか。
    >
引用返信 削除キー/
■33186 / inTopicNo.4)  Re[3]: Ngen.exe(ネイティブ イメージ ジェネレーター)の使い方
□投稿者/ 魔界の仮面弁士 大御所(994回)-(2015/11/19(Thu) 14:16:58)
  • アイコンNo33185に返信(よっし〜さんの記事)
    >> ・ C:\Windows\assembly\NativeImages_ほにゃらら に hoge.ni.exe ファイルが生成される
    > cドライブに「hoge.ni.exe」がありませんし、「NativeImages」フォルダ自体がありません。

    C:\Windows\assembly\ ディレクトリは仮想フォルダになっており、
    その下にある[NativeImages_何某]等の物理フォルダは
    エクスプローラーからでは見えないようになっています。


    コマンドプロンプトを起動して
     DIR %WINDIR%\assembly\* /A:-D /S /B
    のコマンドで列挙してみて下さい。
引用返信 削除キー/
■33187 / inTopicNo.5)  Re[4]: Ngen.exe(ネイティブ イメージ ジェネレーター)の使い方
□投稿者/ 魔界の仮面弁士 大御所(995回)-(2015/11/19(Thu) 14:20:52)
  • アイコンNo33186に追記(魔界の仮面弁士の記事)
    > コマンドプロンプトを起動して
    >  DIR %WINDIR%\assembly\* /A:-D /S /B
    > のコマンドで列挙してみて下さい。

    ドライブレターを割り当てたほうが手っ取り早いかも。
    http://www.atmarkit.co.jp/fdotnet/dotnettips/857substgac/substgac.html
引用返信 削除キー/
■33188 / inTopicNo.6)  Re[5]: Ngen.exe(ネイティブ イメージ ジェネレーター)の使い方
□投稿者/ 774RR 一般人(3回)-(2015/11/19(Thu) 18:23:29)
  • アイコンC:\Windows\assembly 以下を「エクスプローラ」で見たときの挙動は説明されているとおり。
    コマンドプロンプトから見るとまた話は違ってきます・・・

    hoge.ni.exe は直接実行できないようになっているので心配というか考慮無用。
    hoge.exe を起動しようとしたとき hoge.exe の GUID や SHA hash 値など?(詳細不明・未調査)から
    Windows が算出しているマジックナンバーが一致する hoge.ni.exe があれば、使われるっぽいです。
    その辺詳細を追っかけてないので違うかもしれません。

引用返信 削除キー/
■33189 / inTopicNo.7)  Re[5]: Ngen.exe(ネイティブ イメージ ジェネレーター)の使い方
□投稿者/ よっし〜 一般人(12回)-(2015/11/19(Thu) 18:39:59)
  • アイコン魔界の仮面弁士さん、有り難うございます。

    > ドライブレターを割り当てたほうが手っ取り早いかも。
    > http://www.atmarkit.co.jp/fdotnet/dotnettips/857substgac/substgac.html

    確かに774RRさんの「hoge.ni.exe」は生成されておりました。
    有り難うございました。
    確認しましたが・・・
    <Ngenでコンパイル>→<再起動>→<Hoge.exeを実行1>→<Hoge.exeを終了>→<Hoge.exeを実行2>
    としましたが、やはり再起動の1回目は遅いものなのですね。
    一度起動し、再度実行すると早くなっておりました。
    お騒がせいたしました。
    InstallSheldでも「プリコンパイルアセンブリ」オプションがありましたので、こちらでも確認してみます。

    774RRさん、魔界の仮面弁士さん、どうも有り難うございました。


引用返信 削除キー/
■33190 / inTopicNo.8)  Re[6]: Ngen.exe(ネイティブ イメージ ジェネレーター)の使い方
□投稿者/ よっし〜 一般人(13回)-(2015/11/19(Thu) 18:42:25)
  • アイコン解決済み!を付けるのを忘れておりました。

    774RRさん、魔界の仮面弁士さん、どうもおつきあい頂きまして、有り難うございました。

解決み!
引用返信 削除キー/
■33192 / inTopicNo.9)  Re[7]: Ngen.exe(ネイティブ イメージ ジェネレーター)の使い方
□投稿者/ 774RR 一般人(4回)-(2015/11/20(Fri) 08:44:20)
  • アイコンマシン再起動後の hoge.exe の1回目の起動も早くしたいのであれば
    「スタートアップ」に当該 .NET Framework を起動するだけの EXE を入れるという手もあります。
    マシン再起動の時間が長くなるだけのことですけど。

    hoge.exe が要求する .NET Framework と同じ .NET Framework を起動しないと意味がないので、一番簡単には
    1. hoge.exe に、起動直後に即終了するコマンドラインオプションを用意する
     例 : hoge.exe --exit-immediately とすると即終了するようにする
    2. インストーラで「スタートアップ」に hoge.exe --exit-immediately を登録する
    と、マシン再起動時間が長くなる代わりに
    「ユーザが自分の操作で最初に hoge.exe を起動する」時の時間は短くなるでしょう。

    やる意味があるかどうかは微妙っすけど。

解決み!
引用返信 削除キー/



トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

Mode/  Pass/


- Child Tree -