bookmark / IT / 言語 / Cシャープ、.Net


bookmark / IT / 言語 / Cシャープ、.Net

入門

DLL

  • Win32 API呼び出しを手軽に記述するには?
    • NETプログラムからWin32 APIを呼び出すには、「TIPS Win32 APIやDLL関数を呼び出すには?」で解説しているように、次のようなWin32 APIの宣言が事前に必要となる(C#の場合)
[DllImport("kernel32.dll")]
extern static bool Beep(uint dwFreq, uint dwDuration);
  • TIPS Win32 APIやDLL関数を呼び出すには?
    • ちなみに、.NET Frameworkの内部では文字列をUnicodeで処理しているが、Win32 APIやDLL関数に文字列を渡す場合は、デフォルトでANSI文字セットによる表現に変換される
  • Win32 APIやDLL関数に文字列や文字列バッファを渡すには?
    • DLL関数に文字列を渡す場合
    • DLL関数に文字列バッファを渡す場合
      • Win32 APIやDLL関数の中には、戻り値となる文字列を格納するためのバッファを呼び出し元で用意し、そのバッファへの参照(ポインタ)をパラメータに指定しなければならない場合がある...
    • 定数,列挙型を使用するDLL関数の場合

仕様

  • ファイナライザ(=デストラクタ)について
    • コンストラクタの正反対の処理を行うためのメソッドは、ファイナライザ(「デストラクタ」とも呼ばれる)である。しかし.NETでは、ガベージ・コレクション機能(=メモリを自動的に管理するための.NETの機能で、これによって.NETではメモリ・リークが発生しにくくなっている)があるため、ファイナライザを呼び出すタイミングが不確定になっている。そこで、終了処理を明示的に行えるものとしてDisposeメソッドが用意されている。このDisposeメソッドを明示的に呼び出せば、確実にその場で終了処理が行うことができる。
  • なお、暗黙的に終了処理を行うためには(つまり、ガベージ・コレクション機能に自動的に後処理を行わせるには)、Disposeメソッドではなくファイナライザを実装することになる。ファイナライザを実装するには、コンストラクタ名の先頭にチルダ(~)を挿入したメソッド名で「~Form1()」と記述するだけだ(VB.NETでは「Overrides Protected Sub Finalize()」というメソッド名になる)。終了処理についてさらに詳しくは.NET TIPSの 確実な終了処理を行うにはを参照するとよい。

クラス ライブラリ

.Net

  • クライアントアプリケーションに関しては、Windowsフォームベースのアプリケーションとして開発し、Webサーバ上の公開ディレクトリに配置する(図3)。各クライアントには事前に.NET Frameworkのランタイムをインストールしておく。エンドユーザがアプリケーションを利用する際に、Webブラウザからこのexeプログラムを起動すれば、常に最新版を利用することができる(ノータッチデプロイメント)。
  • ダウンロードされたexeプログラムにはCAS(Code Access Security)によるセキュリティ制限がかかるため、当該PC内で不正動作を行うことはできないが、ダウンロード元となったWebサーバとであればHTTP通信が可能である。このため、このexeプログラムはXML Webサービスを呼び出してビジネス処理を進めていくことができる。
  • ASP→ASP.NET移行テクニック
    • COMコンポーネントの活用
    • STA(Single Thread Apartment-model)とMTA(Multi Thread Apartment-model)
    • マネージ・ラッパーの生成
      • マネージ・ラッパーを生成するには、いくつかの方法があるが、ここでは.NET Frameworkに標準で付属するコマンドライン・ツールであるTlbimp.exe(タイプ・ライブラリ・インポータ)を利用してみよう。
      • Tlbimp.exeは、COMコンポーネントからマネージ・ラッパーを生成するためのツールで、コマンド・プロンプトから使用することができる。例えば、ADOのマネージ・ラッパーを生成するには、以下のコマンドを実行するだけでよい。msado15.dllはADOの実体であるDLLファイルだ。 tlbimp msado15.dll これを実行して、カレント・ディレクトリにADODB.dllが生成されれば成功だ。これがマネージ・ラッパーの本体であり、使用する.NETアプリケーション・ルートの「/bin」フォルダにこのDLLファイルをコピーすればよい
    • マネージ・コードをアンマネージ・コードから利用する
      • マネージ・コードとアンマネージ・コードの相互運用を想定した場合、マネージ・コードからアンマネージ・コードの呼び出しばかりではない。アンマネージ・コードからマネージ・コードを呼び出すというケースも発生する。
      • すなわち、COMコンポーネントから入れ子に呼び出していたCOMコンポーネントを部分的にマネージ・コード(.NETアセンブリ)に置き換えたというような場合である。段階的な移行や部分的な移行のようなケースを想定した場合、それは十分にあり得る話だ。
      • そのような場合にも、.NET Frameworkは相互運用のための手段を提供している。それが.NET Frameworkに標準で用意されているコマンドライン・ツールであるRegasm.exe(アセンブリ登録ツール)だ。Regasm.exeは、COMクライアントがアセンブリを参照できるようにレジストリの登録を行い、また、タイプ・ライブラリを作成するための手段を提供する。
      • 例えば、自作の.NET用クラス・ライブラリSample.dllのレジストリ登録を行うには、以下のようにすればよい。
      • regasm /tld:Sample.tlb Sample.dll
      • わずかにこれだけのコマンドでSample.dllがレジストリに登録され、カレント・ディレクトリにはタイプ・ライブラリSample.tlbが生成される。これで、旧来のCOMコンポーネントを利用するのとまったく同じ手続きで、Sample.dllに含まれる.NETのクラスを呼び出すことが可能となる。

DB

  • using を使った DB トランザクションのテンプレート
     using (SqlConnection con = new SqlConnection(DBConnectionString)) {
       con.Open();
       using (SqlTransaction tran = con.BeginTransaction(IsolationLevel.Serializable)) {
           try {
               // データベーストランザクションを実行
               tran.Commit();
           } catch {
               tran.Rollback();
               throw;
           	}
         }
     }

VB

  • VB.NET固有の関数をC#で使用するには
    • VB.NETには、文字の全角/半角変換、ひらがな/カタカナ変換などの便利な機能が言語固有の関数として用意されている。しかしそれら関数の実体は、.NET Frameworkのクラス・ライブラリに含まれるクラスで記述されているだけなので、C#などのほかの言語からも呼び出して利用することができる。VB.NETは.NET Frameworkにデフォルトで含まれているため、実行時に特別なコンポーネントなどが必要となることもない。
  • まずはアセンブリの参照設定を行っておこう。参照設定はプログラムをコンパイル(あるいはビルド)する際に必要となる。またVisual Studio .NETでは、そのアセンブリに含まれるクラスに対してIntelliSense?が有効となる。
  • コマンドラインからプログラムをコンパイルする場合には、次のように/reference:オプション(省略形は「/r:」)により、Microsoft.VisualBasic?.dllファイルを参照する。
 csc /r:Microsoft.VisualBasic.dll MyProgram.cs

etc