タグ

ブックマーク / tekk.hatenadiary.org (6)

  • DLL(Win32 API など) を実行時に動的ロードする。(LoadLibrary,GetProcAddress,FreeLibrary) - tekkの日記 C#,VB.NET

    Win32APIを使用する場合はDLLImport属性を付けて使用したいAPIを事前に定義して使います。DllImport属性は使用したいDLLとのリンクがコンパイル時に設定されるためアプリ起動時にリンクを解決しようとします。(リンクを解決するというのは、DLLをメモリ上にロードし使用したい関数のエントリーポイントを決定することです。)これは、DLLとの通常のリンクの仕方ですが、リンクしたいDLLがシステムに存在しない場合や、使用したい関数が対象のDLLに存在しない場合、(OSのバージョンなどの違いで発生することが良くあります。)アプリはリンクに失敗し起動しません。 これに対処するためには、DLLの実行時読み込み(動的読み込みとも言います)を使用します。 実行時読み込みには、LoadLibrary,GetProcAddress,FreeLibraryの各Win32APIを使用します。アプリ

    DLL(Win32 API など) を実行時に動的ロードする。(LoadLibrary,GetProcAddress,FreeLibrary) - tekkの日記 C#,VB.NET
    honamis
    honamis 2013/01/08
  • ウインドウメッセージのリフティング処理(PostMessageの隠れた使い方) - tekkの日記 C#,VB.NET

    ウインドウアプリケーションでは、ウインドウそれぞれがメッセージキューを持っていて順番にメッセージを処理します。処理が終わるまでは、次のメッセージは処理されません。この特性を利用して、処理のタイミングを調整するプログラミングテクニックをウインドウメッセージのリフティングと呼びます。 一般的な使い道は、画面の描画後に処理を行いたい場合などに使います。例えば、画面の初期表示時に行う処理で描画が終わってから処理を行いたい場合にForm_Loadでは早すぎる場合があります。その場合に、Form_Loadイベントの末尾でウインドウメッセージをPostMessageで送信しておくとWM_PAINTなど描画系のメッセージを処理した後に、メッセージを受信して任意の処理を行うことができます。 ウインドウメッセージを送信すると、すぐに処理されたり並行して処理されると思いがちですが、PostMessageで送信し

    ウインドウメッセージのリフティング処理(PostMessageの隠れた使い方) - tekkの日記 C#,VB.NET
  • Null許容型はGetTypeでNullableを返さず値型を返す - tekkの日記 C#,VB.NET

    Null許容型ですが、GetTypeメソッドを呼び出した際にNullableではなく値型を返すという特性があります。NullableのGetTypeはintを、NullableのGetTypeはDateTimeという風に。 Nullableを導入した際の値型との互換性のためだと思いますが、ちょっと変わった動作です。そのためだと思いますが、Nullableをdynamic型に代入するとHasValueプロパティが使えなくなります。dynamic型は内部でGetTypeを実行して型情報を取得しているためだと考えられます。 ちなみにNullableなどをプロパティとして持つクラスに対してリフレクションでプロパティを取得し、PropertyTypeで型情報を取るとNullableが取得できます。問題があるのは、実行時のNull許容型の値からGetTypeする場合です。 Nullableの動作を確認

    Null許容型はGetTypeでNullableを返さず値型を返す - tekkの日記 C#,VB.NET
    honamis
    honamis 2012/07/05
  • どんなオブジェクトでもコピーできる汎用のディープコピー処理(ICloneable, MemberWiseClone, Serializable, BinaryFormatter, MemoryStream) - tekkの日記 C#,VB.NET

    シリアライズを利用した汎用のオブジェクトのディープコピー処理について整理しました。BinaryFormatterを使用してMemoryStreamに対してシリアライズ/デシリアライズを行いオブジェクトのメモリイメージのコピーを作成するテクニックです。理論上、Serializable属性を付与したすべてのオブジェクトに対してディープコピーが可能になります。 ICloneableインタフェース、MemberWiseCloneメソッドを使用したシャローコピーについては以下の記事を参考にしてください。 ■オブジェクトのコピー。ICloneableインタフェース、MemberWiseClone、シリアライズを利用したインスタンスのコピー。 http://d.hatena.ne.jp/tekk/20091012/1255362429 C# ジェネリック版と拡張メソッド版の2種を用意してみました。 us

    どんなオブジェクトでもコピーできる汎用のディープコピー処理(ICloneable, MemberWiseClone, Serializable, BinaryFormatter, MemoryStream) - tekkの日記 C#,VB.NET
  • アプリケーションの実行パスを取得する。どの方法が適切か検討してみた。 - tekkの日記 C#,VB.NET

    アプリケーションの実行パスを取得する方法について調べると実にさまざまな方法が見つかります。どの方法でも実行ファイルのパスを取得できるようなのですが、では実際にどの方法を使えばいいのか。一番良い方法はどれなのかを検討してみました。 まずは、Googleの検索結果を見て行きます。 @IT 実行ファイルのパスを取得するには? http://www.atmarkit.co.jp/fdotnet/dotnettips/016exepath/exepath.html Assembly myAssembly = Assembly.GetEntryAssembly(); string path = myAssembly.Location; string path = Application.ExecutablePath; @IT ClickOnceアプリのディレクトリ・パスを取得するには?[2.0のみ、C

    アプリケーションの実行パスを取得する。どの方法が適切か検討してみた。 - tekkの日記 C#,VB.NET
    honamis
    honamis 2011/04/26
  • 現在実行しているDLLのパスを取得する。(GetExecutingAssembly ) - tekkの日記 C#,VB.NET

    .Net Frameworkでは、アプリケーションの配置はXCopyによる配置が主流であるためExeとDLLの場所が異なる場合は、あまり多くありません。殆どの場合、Exeの場所を求めれば課題を解決することができるため、DLLのパスを取得する必要性は以前ほどなくなってきています。 アンマネージドDLLの一種であるActiveX DLLはシステム全体で1箇所のみの配置で、「DLLの位置を基準に、サブフォルダの設定ファイルを読み込む」などといった用途でDLLのパスを取得する事が多くありました。そんな時、アンマネージドDLLではDLLのパスを取得する際に GetModuleFileName を使ってパスを取得していました。 使用用途は以前より限られてくるものの .Net Framework の DLLでのパスの取得方法について整理してみました。 まず、DLLのパスの取得に利用できそうなメソッドがA

    現在実行しているDLLのパスを取得する。(GetExecutingAssembly ) - tekkの日記 C#,VB.NET
  • 1