メイン

プログラミングテクニック アーカイブ

2005年04月09日

INI ファイルと構成ファイルの読み書き

http://www.microsoft.com/japan/msdn/vbasic/migration/tips/INIfile.aspx

今どきは構成ファイルがあるから、INIファイルはそんなに使う機会はないと思うのですが、覚え書きということで。

Word や Excel などの Office 製品の制御

http://www.microsoft.com/japan/msdn/vbasic/migration/tips/office.aspx

COMを使うことはまだまだありそうですし、Officeをコントロールしたいこともありそうです。

要は、参照設定をして普通にインスタンシングすればいいだけという話ではあるのですが。
用が済んだら、Marshal.ReleaseComObject 呼び出しを忘れずに。
#って私が忘れるんですけど。

2005年05月04日

MonitorクラスとSyncLockキーワードとの比較

MSDN Magazine Febrary 2005の記事を検証してみました。

http://msdn.microsoft.com/msdnmag/issues/05/02/BasicInstincts/default.aspx

といっても、メインのテーマではなくて、まずはMonitorクラスとSyncLockとの類似点(あるいは相違点)の確認。
#言うまでもなく、SyncLockはVisual Basic .NETのキーワード。C#ではlockです。

以下のような簡単なコードを書いてみました。
Pointを表す単純なクラスをMonitorを使う方法とSyncLockを使う方法とで比較するものです。

----------------------------------------------------------------
Imports System.Threading


Public Class PointMonitor
  Private x As Integer
  Private y As Integer

  Sub New(ByVal x As Integer, ByVal y As Integer)
    Me.x = x
    Me.y = y
  End Sub

  Sub GetPointPosition(ByRef x As Integer, ByRef y As Integer)
    Monitor.Enter(Me)
    Try
      x = Me.x
      y = Me.y
    Finally
      Monitor.Exit(Me)
    End Try
  End Sub

  Sub SetPointPosition(ByVal x As Integer, ByVal y As Integer)
    Monitor.Enter(Me)
    Try
      Me.x = x
      Me.y = y
    Finally
      Monitor.Exit(Me)
    End Try
  End Sub
End Class


Public Class PointLock
  Private x As Integer
  Private y As Integer

  Sub New(ByVal x As Integer, ByVal y As Integer)
    Me.x = x
    Me.y = y
  End Sub

  Sub GetPointPosition(ByRef x As Integer, ByRef y As Integer)
    SyncLock Me
      x = Me.x
      y = Me.y
    End SyncLock
  End Sub

  Sub SetPointPosition(ByVal x As Integer, ByVal y As Integer)
    SyncLock Me
      Me.x = x
      Me.y = y
    End SyncLock
  End Sub
End Class
----------------------------------------------------------------

これをビルド(Release Build)して、ディスアセンブラ(Ildasm.exe)を使って、実際にどのようなMSILコードが生成されたのか見てみました。

------ PointMonitorクラスのGetPointPositionメソッド ------
.method public instance void GetPointPosition(int32& x, int32& y) cil managed
{
// コード サイズ 32 (0x20)
.maxstack 2
IL_0000: ldarg.0
IL_0001: call void [mscorlib]System.Threading.Monitor::Enter(object)
.try
{
IL_0006: ldarg.1
IL_0007: ldarg.0
IL_0008: ldfld int32 LockTest.PointMonitor::x
IL_000d: stind.i4
IL_000e: ldarg.2
IL_000f: ldarg.0
IL_0010: ldfld int32 LockTest.PointMonitor::y
IL_0015: stind.i4
IL_0016: leave.s IL_001f
} // end .try
finally
{
IL_0018: ldarg.0
IL_0019: call void [mscorlib]System.Threading.Monitor::Exit(object)
IL_001e: endfinally
} // end handler
IL_001f: ret
} // end of method PointMonitor::GetPointPosition
----------------------------------------------------------

------ PointLockクラスのGetPointPositionメソッド ------
.method public instance void GetPointPosition(int32& x, int32& y) cil managed
{
// コード サイズ 34 (0x22)
.maxstack 2
.locals init (class LockTest.PointLock V_0)
IL_0000: ldarg.0
IL_0001: stloc.0
IL_0002: ldloc.0
IL_0003: call void [mscorlib]System.Threading.Monitor::Enter(object)
.try
{
IL_0008: ldarg.1
IL_0009: ldarg.0
IL_000a: ldfld int32 LockTest.PointLock::x
IL_000f: stind.i4
IL_0010: ldarg.2
IL_0011: ldarg.0
IL_0012: ldfld int32 LockTest.PointLock::y
IL_0017: stind.i4
IL_0018: leave.s IL_0021
} // end .try
finally
{
IL_001a: ldloc.0
IL_001b: call void [mscorlib]System.Threading.Monitor::Exit(object)
IL_0020: endfinally
} // end handler
IL_0021: ret
} // end of method PointLock::GetPointPosition
-------------------------------------------------------

Monitorを使う方がわずかにコードサイズは小さいようですが、ほぼ違いはないと言っていいでしょう。結局SyncLockの方もコンパイルするとMonitor.Enterが使われていますし。

ということでSyncLockはMonitorを使ってロックする方法に対する簡単な記述を提供してくれるものだということがわかるわけです。
TryだのFinallyだの書かなくていいぶん、コードがシンプルで見やすくなりますね。

とすると、Monitor.Enterを使うのは、言語仕様としてSyncLock(やC#のlock)に相当するキーワードを持っていない言語製品の場合に限られると思っていいかもしれません。あとは、コードでSyncLockを使う場合、頭の中でほぼ等価なMonitor.Enterと置き換えてみて、ロジックの確認をしてみるのはいいことでしょうね。

ただし、SyncLockでは足りないこともあって、それはアクセスの競合が発生した場合のタイムアウトが必要な場合。この時はMonitor.TryEnterメソッドを使うことになります。

上記の記事はなかなか興味深い内容になっています。一読をお勧めします。

2005年05月14日

Configuring ClickOnce Trusted Publishers

http://msdn.microsoft.com/smartclient/default.aspx?pull=/library/en-us/dnwinforms/html/clickoncetrustpub.asp

出ました、ClickOnceのセキュリティに関する記事。
#探せば前から他の情報があったのかもしれません。そうだったらすみません、勉強不足です。

2005でVisual Studioに追加された機能である、App.configのデザイン画面で設定すればいいようですね。

2005年06月21日

STL.NET 入門

http://www.microsoft.com/japan/msdn/vs05/visualc/stl-netprimer.asp

Visual Studio 2005ではSTLが.NET Framework上でも使えるようになるそうです。
そうですか、すみません、私はC++/CLI はまったくわかっていないので。

STLがどうとか言う前に、

ArrayList ^as = gcnew ArrayList;

という表記になじめないんですよねぇ。慣れの問題だというのはわかっているんですが。

2005年08月06日

Visual Studio 2005のコードサンプル

Visual Studio 2005のコードサンプルです。

Code Samples
http://lab.msdn.microsoft.com/vs2005/downloads/code/

101 Samples for Visual Studio 2005
http://lab.msdn.microsoft.com/vs2005/downloads/101samples/default.aspx

2005年09月16日

C#のドキュメントコメント

FAQですが、インターフェイスのリファレンスを生成するためのコメントをソースコード中に埋め込むと、メンテナンス性が向上しますね。

久しぶりにコードを書いているので、コメントの要素をすっかり忘れていました。
備忘録として、参考になるページにリンクしておきます。

http://www.atmarkit.co.jp/fdotnet/teamdev/teamdev01/teamdev01_01.html

http://www.atmarkit.co.jp/fdotnet/teamdev/teamdev02/teamdev02_01.html

2006年02月01日

別バージョンのDLLを同時に使う方法

Using different versions of the same dll in one application

http://blogs.msdn.com/abhinaba/archive/2005/11/30/498278.aspx

これはいい。こんな方法があったんですね。
これがあれば万一のデグレード時に緊急対応できそうです。

#後ろ向きな利用は考えものですが(笑)

2006年05月21日

メソッドやプロパティの動的な呼び出し

メソッドやプロパティの名前を実行時に解決したい時には、以下の方法で動的に呼び出します。

簡単なサンプルで見てみます。

呼び出されるクラスは以下の通り:

// 呼び出されるクラス
class TestClass
{
    // プロパティ
    private string myName = string.Empty;
    public string MyName
    {
        get { return myName; }
        set { myName = value; }
    }

    // 引数なしのメソッド
    public string Hello()
    {
        return "Hello !!";
    }

    // 引数ありのメソッド
    public int Add(int n1, int n2)
    {
        return n1 + n2;
    }
}


呼び出し側は以下の通り:

// 呼び出し方の例
class Program
{
    static void Main(string[] args)
    {
        TestClass tc = new TestClass();
        Type ttc = tc.GetType();

        // 引数なしのメソッド
        MethodInfo mi = ttc.GetMethod("Hello");
        if (mi != null)
        {
            string mes = (string) mi.Invoke(tc, null);
            Console.WriteLine(mes);
        }

        // 引数ありのメソッド
        mi = ttc.GetMethod("Add");
        if (mi != null)
        {
            int result = (int)mi.Invoke(tc, new object[] { 2, 3 });
            Console.WriteLine(result);
        }

        // プロパティの読み書き
        PropertyInfo pi = ttc.GetProperty("MyName");
        if (pi != null)
        {
            // Set
            pi.SetValue(tc, "Visual Studio", null);

            // Get
            string name = (string) pi.GetValue(tc, null);
            Console.WriteLine(name);
        }
    }
}


ポイントは、

  • オブジェクトの型をGetTypeで取得する

  • メソッド名、プロパティ名を指定して、Type.GetMethod,Type.GetPropertyを呼び出す。戻り値はSystem.Reflection名前空間の MethodInfo, PropertyInfo で受ける

  • メソッドの場合には、MethodInfo.Invoke でメソッドを呼び出す。その際、呼び出したいメソッドが引数なしならば Invoke の第2引数は null、引数ありならばnew object[] { ... };とする

  • パラメータの場合には、PropertyInfo.SetValue, GetValue を呼び出す。なお、GetValueの戻り値はObject型なので適切にキャストする。


頻繁に使うテクニックではありませんが、こんなことができるということを覚えておくといいでしょう。

2007年01月24日

VBScriptから .NETを利用する

スクリプトなので微妙に開発ネタではないんですが。

http://www.microsoft.com/technet/technetmag/issues/2007/01/HeyScriptingGuy/default.aspx?loc=jp

VBScriptから .NET Framework のクラス(全部ではありませんが)を利用できますよ、という解説記事。
スクリプトは必要になる都度、やっつけて数行書くくらいで勉強してないので結構衝撃でした(恥)

面白いけど今となってはPowerShellがありますから。
(Vista用 PowerShell、早くカモーン!)

2007年02月08日

イベント ログを削除する方法

かなり無茶な操作なので、本当に必要な時だけ細心の注意を払って、自己責任でどうぞ。

http://msdn2.microsoft.com/ja-jp/library/twdecbsx(VS.80).aspx

アプリケーションを開発していると、たまにこういうことをする必要があるわけです(テストとかね)。

2007年06月16日

.NET でサービスを作る時の定石

Writing a Useful Windows Service in .NET in Five Minutes

http://blogs.msdn.com/bclteam/archive/2005/03/15/396428.aspx


.NETを使ってWindowsサービスを作る手順を説明しています。
手順自体は大して難しくないんですけど、サービスは品質が命なので(そう簡単に落ちてもらっちゃ困るわけだし)神経使いますね。

それでも、ともかくスケルトンを作ること自体は "in Five Minutes" なので、その部分のハードルは高くないということです。

続きを読む ".NET でサービスを作る時の定石" »

2007年09月20日

Virtual Earth Map Control 5.0

完全に自分のための覚え書き。

Virtual Earth 用 SDK の日本語対応だそうです。

http://msdn2.microsoft.com/ja-jp/library/bb429619.aspx

そんなサイトを作る予定は全くないんですが、一応ブックマークしておきます。

2007年11月06日

オブジェクトの有効期間の管理

MSDN Magazine 2007年11月号の記事。

http://msdn.microsoft.com/msdnmag/issues/07/11/CLRInsideOut/default.aspx?loc=jp

ライフタイム管理って苦手です(笑)
他にも苦手なことは多いけど、これもやっぱり苦手。
弱参照って言われてもよく分かってないし・・・。

勉強のために読んでみます。

続きを読む "オブジェクトの有効期間の管理" »

2007年12月09日

分離ストレージの利用方法

分離ストレージ=ユーザーごと、アセンブリごとの固有のデータ保存領域 です。

仕事に関連してちょっと実験したので、自分のための覚え書き。

自分(アプリ)専用のデータキャッシュなんかにどうぞ。

Vista の MSDTC -install の挙動が怪しい

自分のための覚え書き。

Vista で MSDTC が上手いこと動いてくれない(RPC が拗ねてイベントログにエラーを吐く)現象が発生しました。
いろいろ調べてもなかなかわからなくてやっとたどり着いた情報がこれ。

MSDTC -install fails to reinstall Distributed Transaction Coordinator (Windows Vista)

http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=1456054&SiteID=1

Vista での MSDTC -install の挙動が変わった(バグか?)のが原因みたいです。 

実はまだ自分の手元では確認していないけど、これで直るといいんだけどなあ。

 

※追記(12/17)
違う、違う。
Vista で ネットワーク DTC が上手く動かないと思ったら、RPC のポートの問題でした。

XPではRPC用にポート3つほど空けておけばいいのに、Vistaではそれでは足りない様子(10個空けたら動いた)。ファイアウォールなしの環境だと苦労せずに動くので不思議だなと思ってたんですが、気づかなかったお前が不思議だ>自分
ちなみにイベントビューアにエラーが出ているのでちゃんと読んでれば悩まずにすみました。

詳しくは改めて整理して投稿します。

About プログラミングテクニック

ブログ「.NETの覚え書き」のカテゴリ「プログラミングテクニック」に投稿されたすべてのエントリーのアーカイブのページです。過去のものから新しいものへ順番に並んでいます。

前のカテゴリはツールの使い方です。

次のカテゴリは雑談です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

Powered by
Movable Type 3.34