連載Windows業務アプリケーション開発 Q&A #1グレープシティ株式会社 八巻 雄哉2006/06/17 |
Page1
Page2
|
|
.NETアプリで使用メモリがどんどん増えていく
.NETで開発したWindowsアプリケーションを実行し、タスク・マネージャで確認すると、使用メモリがどんどん増加しているように見えます。以前Visual Basic 6.0で開発したアプリケーションではこのようなことはなかったのですが、これは問題ないのでしょうか?
Visual Basic 6.0(以下VB 6)では、オブジェクトを参照している変数がスコープを抜けるなどして参照から外れた場合、自動的にオブジェクトが破棄されていました。.NETでも、使用されなくなったオブジェクトを自動的に解放する「ガベージ・コレクション」という機能がサポートされています。しかし、VB 6のときとは大きく違う点があります。それは、メモリが解放されるタイミングです。
|
.NETでは、より多くの空きメモリが必要だと判断されたときにガベージ・コレクションが行われます。つまり、使用できるメモリがたっぷり余っている場合には、いつまでたってもガベージ・コレクションは行なわれません。そのため、あたかもメモリ・リークかのごとく、アプリケーションのメモリ使用量が増加することがありますが、これは正常な動作です。
ちなみに、.NETのアプリケーションについては、タスク・マネージャで表示されているメモリが実際のアプリケーションのメモリ使用量とは限りません。少し試してみましょう。
まずVB 6で、単純なフォームが表示されるだけのアプリケーション「project1.exe」を作成し、実行します。実行中のproject1.exeのメモリ使用量を、タスク・マネージャの[プロセス]タブから確認します。私の環境では「4,704K」と表示されています。
次にVisual Studio 2005で、単純なフォームが表示されるだけのアプリケーション「WindowsApplication1.exe」を作成し、実行します。同じようにタスク・マネージャからWindowsApplication1.exeのメモリ使用量を確認してください。私の環境では「12,196K」と表示されています。この段階では、VB 6と比べるとなんと約4倍の量になっています。
では、いったんウィンドウを最小化してから元のサイズに戻した後に、もう一度タスク・マネージャを確認してみてください。VB 6のときと同じか、それ以上に少ないメモリ使用量になっていることが確認できるはずです。私の環境では「3,224K」と約4分の1になりました。
このことからも分かるように、.NETのアプリケーションの場合にはタスク・マネージャで表示されているメモリ使用量は、実際に使用されているメモリ量とイコールではありません。タスク・マネージャに表示されるメモリ使用量は「ワーキング・セット」と呼ばれ、事前に確保されているメモリ領域に過ぎません。
なお、.NETにおいて実際に使用しているメモリのサイズを確認するには、GCクラス(System名前空間)のGetTotalMemoryメソッドを使用して計測する必要があるということを覚えておいてください。
ActiveXコントロールの1クリック回避
WindowsにIE用の「更新プログラム(KB912945)」を適用するとActiveXコントロールをアクティブ化するのに1クリックが必要になり、Webアプリケーションの使い勝手が非常に悪くなってしまいます。これを回避して、以前のようにクリックなしで使えるようにする方法があると聞いたのですが……。
この「更新プログラム(KB912945)」や「セキュリティ更新プログラム(KB912812)」を適用すると、Webページ上のActiveXコントロールをアクティブ化する(操作する)ために、マウスのクリックや[Enter]キー入力などの操作が必要になります。
これを回避するための具体的な対応策がいくつか存在しますが、ここではJavaScriptのdocument.createElementメソッドを使用する方法を紹介します。ActiveXコントロールの例として、グレープシティの帳票作成コンポーネントである「ActiveReports for .NET」のActiveXビューア(arview2.ocx)を用います。
ActiveXビューア(arview2.ocx)の表示例 |
更新プログラムを適用すると、ActiveXコントロールをアクティブ化する(操作する)ためにはマウスのクリックや[Enter]キー入力などの操作が必要となる。 |
Webフォーム(.aspxファイル)の記述において、このActiveXビューアを表示している部分の記述は、例えば下記のようになっています。
|
|
WebフォームでActiveXビューア(arview2.ocx)を表示するコード例 | |
※Cabファイルのバージョン番号の指定(ここでは「2,4,1,1280」)は、使用するActiveXビューアのバージョンにより異なります。 |
まず、この部分を下記のように変更します。
|
|
ActiveXビューアを表示する部分に記述するコード | |
ここでは実際の処理コードを外部ファイルであるexternal_script.jsに記述し、それを取り込んでいる。 |
次に「external_script.js」という名前のファイルを新たに作成し(Visual Studioを使用している場合には、「新しい項目の追加」でJScriptファイルを選択)、下記の内容を記述します。
|
|
external_script.jsの内容 | |
<OBJECT>要素でActiveXコントロールを直接記述するのではなく、document.createElementメソッドで“object”オブジェクトを作成することにより、アクティブ化のためのクリックが必要なくなる。 |
このexternal_script.jsファイルは、ActiveXビューアを使用しているWebフォーム(.aspxファイル)と同じフォルダに配置します。これで対応完了です。
なお一時的な対応策としては、「Internet Explorer 用互換性修正プログラム(KB917425)」を適用して、ActiveXに関する仕様のみを以前の状態に戻す方法もあります。ただし、この方法の場合でも、6月14日に公開された「Internet Explorer 用の累積的なセキュリティ更新プログラム(916281)(MS06-021)」を適用するとそれが無効となってしまいます。
INDEX | ||
Windows業務アプリケーション開発 Q&A #1 | ||
1..NETアプリで使用メモリが増えていく/ActiveXコントロールの1クリック回避 | ||
2..NETアプリで両面印刷ができない/.DLLファイルの配置について | ||
「Windows業務アプリケーション開発 Q&A」 |
- 第2回 簡潔なコーディングのために (2017/7/26)
ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている - 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう - 第1回 明瞭なコーディングのために (2017/7/19)
C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える - Presentation Translator (2017/7/18)
Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|
- - PR -