Koropokkur.NET 0.2.5をリリースしました

Koropokkur.NET 0.2.5をリリースしました。
http://www.seasar.org/wiki/index.php?SeasarWhatsNew%2F2011-05-02#ta84f2d9

プロジェクト内のファイル、フォルダを整理する「VSArrange」を
コンソールからでも実行できるように修正しました(「VSArrangeConsole.exe」)。
また、それに伴い設定ファイル編集エディタもVisualStudioを起動させずに使用できるよう
別プログラムとして独立させました(「VSArrangeConfig.exe」)。

VisualStudio2010上で動作確認を行っています。


[Improvement]
[KOROPOKKURNET-32] VSArrangeをコンソールから実行できるようにする

【VisualStudio】アドイン以外からソリューション情報を参照する方法

たまにはリリースのお知らせ以外の更新を。


VisualStudioでアドインプロジェクトを作成すると
起点となるメソッドで引数からDTE2という型のオブジェクトを取得することができ、
そこから起動中のVisualStudio、ソリューションの情報を参照、取り扱うことができます。


/// アドインを実装するためのオブジェクトです。
///
public class Connect : IDTExtensibility2 {
(省略)
/// IDTExtensibility2 インターフェイスの OnConnection メソッドを実装します。アドインが読み込まれる際に通知を受けます。
/// ホスト アプリケーションのルート オブジェクトです。
/// アドインの読み込み状態を説明します。
/// このアドインを表すオブジェクトです。
///
public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom)
{
// ↓このオブジェクトからVisualStudio、ソリューション等の情報を参照、操作できる
_applicationObject = (DTE2)application;
_addInInstance = (AddIn)addInInst;
}
(省略)


このDTE2オブジェクトをアドイン以外(通常のコンソールプログラム等)のプログラムから
取得する方法
をメモ代わりに書いてみます。
実装例のコードはVisualStudio2010で作成、確認しています。

  1. 環境の整備
    プロジェクトの「参照設定」に「EnvDTE」「EnvDTE80」を追加する
    ※アドインが使えるエディションのVisualStudioをインストールしていない環境では未確認
  2. コーディング
    下記のようにソースコードを書く


// DTE2オブジェクト取得
var vs = (EnvDTE80.DTE2)System.Activator.CreateInstance(
System.Type.GetTypeFromProgID("VisualStudio.DTE.10.0"));
// ソリューションファイルを開く
vs.Solution.Open(@"C:\hoge\Seasar.sln");
System.Console.WriteLine(vs.Solution.FullName);

// 読み込んだソリューション下のプロジェクト名を出力
foreach (Project p in vs.Solution.Projects) {
System.Console.WriteLine(p.FullName);
}

○実行結果

C:\hoge\Seasar.sln
C:\hoge\Seasar\Seasar.csproj
C:\hoge\Seasar.Tests\Seasar.Tests.csproj
C:\hoge\Seasar.Unit\Seasar.Unit.csproj
C:\hoge\Seasar.DynamicProxy\Seasar.DynamicProxy.csproj
C:\hoge\Seasar.Windows\Seasar.Windows.csproj
C:\hoge\Seasar.Quill\Seasar.Quill.csproj
C:\hoge\Seasar.Quill.Examples\Seasar.Quill.Examples.csproj
C:\hoge\Seasar.Dao\Seasar.Dao.csproj
C:\hoge\Seasar.Dxo\Seasar.Dxo.csproj
【注意点】
DTE2オブジェクトを生成する際に渡している「"VisualStudio.DTE.10.0"」の
数字部分には扱いたいVisualStudioのバージョン番号が入ります。
VisualStudio2010なら「10.0」、2008なら「9.0」となります。
このバージョン番号と実際に読み込んだソリューションファイルのバージョンが
合っていない場合、COMExceptionが発生します。
○例

// DTE2オブジェクト取得(バージョン番号は9.0(VisualStudio2008用))
vs = (DTE2)System.Activator.CreateInstance(
System.Type.GetTypeFromProgID("VisualStudio.DTE.9.0"));
// VisualStudio2010で作成したソリューションファイルを開く
vs.Solution.Open(TEST_SOL_PATH);
System.Console.WriteLine(vs.Solution.FullName);
○実行結果

System.Runtime.InteropServices.COMException (0x80004004): 操作は中断されました (HRESULT からの例外: 0x80004004 (E_ABORT))
場所 EnvDTE.SolutionClass.Open(String FileName)


対処例として、とりあえず思いつくのはソリューションファイル内に書かれている
書式バージョン番号(注:何故かVisualStudioのバージョン+1)を利用する方法です。


○ソリューションファイルの中身(先頭行に書式のバージョン番号が記述してある)

Microsoft Visual Studio Solution File, Format Version 11.00
# Visual Studio 2010
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Seasar", "Seasar\Seasar.csproj", "{7224C3B3-2C10-4AC5-A118-56558ED4C3C9}"
EndProject
(省略)
○実装例

const string ENV_DTE_OBJ_NAME = "VisualStudio.DTE.";
var version = GetVersion(solutionPath); // ソリューションファイルを読んでバージョン番号を取り出す
var vs = (DTE2)Activator.CreateInstance(Type.GetTypeFromProgID(ENV_DTE_OBJ_NAME + version));

Koropokkur.NET 0.2.4をリリースしました

ま、前のバージョンから一年近く。。。
Seasar.NETの.NET Framework4.0対応などをやっていたら
いつの間にかこんなに経ってしまいました。


VSArrange(プロジェクト整理機能)をコンソールで動作するようにしたりとか
CopyGen(コピー処理の自動生成)をフォーム上のコントロールに対しても
コピー処理を生成できるようにしたりとか
ヘッダをかゆい所に手が届く感じで生成する機能とか
実装してみたい要素はいくつかあるのですが、
製作者がぐうたらなために中々進まずにいます。


今回のバージョンでは機能的には追加、更新はありません。
VisualStudio2010で動作するようにほんの少し修正、動作確認をしています。
2008でも動くことは確認していますが
2005では製作者に環境がないため試すことができていません。
ここをご覧になっている方がどれだけいるかわかりませんが、
もしお試しになられた方がいらっしゃいましたら
seasar-dotnetメーリングリストやこの記事のコメントなどにでも
お知らせいただけたらと思います。


[Improvement]
[KOROPOKKURNET-30] VS2010上でkoropokkur.netを使用可能にする

S2Container/S2Dao.NET 1.4.0 RC2をリリースしました

またもや久々の更新です。

S2Container/S2Dao 1.4.0 RC2をリリースしました。

変更点は下記ページをご覧下さい。
S2Unit.NETの不具合修正を行っています。

http://www.seasar.org/wiki/index.php?SeasarWhatsNew/2011-01-29#n46d675c

DBFlute.NET 0.8.9.23の下記exampleプロジェクトで

動作確認をしています。

・dfnet-asp.net-example

・dfnet-basic-example

・dfnet-multipledb-quill-example

S2Container/S2Dao.NET 1.4.0 RC1をリリースしました

S2Container/S2Dao 1.4.0 RC1をリリースしました。

変更点は下記ページをご覧下さい。
http://www.seasar.org/wiki/index.php?SeasarWhatsNew/2010-12-10#r78f019b

DBFlute.NETでの動作は未確認です。
確認がとれ次第お知らせします)

Quill」についてのみ.NET Framework 4.0に対応しています。
[seasar-dotnet:1887]でjfluteさんが仰っている通り、
条件付き公開となります。

// Quill .NET 4.0 対応がそろそろ!? | jfluteの日記
http://d.hatena.ne.jp/jflute/20101207

もうすぐリリースですよ

.NET4対応版のSeasar.NET 1.4.0 RC1をもうすぐ(今週中くらい?)リリースします。
jfluteさんが詳細を書いて下さっています。
Quillの.NET4.0対応がそろそろ!?

これが終わったら「Koropokkur.NET」のVS2010対応に
取り掛かる予定です。

MbUnit3.1の機能拡張を試してみた

.NET用のテストフレームワークの一つ「MbUnit」。
バージョン3.1での機能拡張を試してみました。
Gallio/MbUnitについてはコチラ


MbUnitではユーザ独自に拡張した属性を使用することで
継承やテストクラスごとに(NUnitでもお馴染な)SetUp、TearDownメソッドで
共通処理の呼び出しを書くなどしなくても
テスト共通の前処理、後処理等を実行することができるようになります。


手探りでの実行結果になりますが、備忘録代わりに。

  • 1.拡張用の属性クラスを作成
    • 参照設定
      Gallioインストール後、参照設定の「NET」タブから下記dllを追加)
    • 使用クラス
      • MbUnit.Framework.TestDecoratorAttribute
        「Execute」などの各メソッドをoverrideして拡張したい処理を記述します。


///
/// MbUnit3拡張クラス
///

public class CustomTestAttribute : MbUnit.Framework.TestDecoratorAttribute {
private readonly string TYPE_NAME;
public CustomTestAttribute() {
TYPE_NAME = GetType().Name;
}

///


/// テストメソッド実行時に呼び出される
///

///
/// テストクラスのインスタンス等、各種テスト情報を保持
///
protected override void Execute(Gallio.Framework.Pattern.PatternTestInstanceState testInstanceState) {
Console.WriteLine("* [Start]:{0}.Execute, TestInstance={1}", TYPE_NAME,
testInstanceState.FixtureInstance == null ? "null" : testInstanceState.FixtureInstance);

base.Execute(testInstanceState); // テストメソッドの呼び出し

Console.WriteLine("* [End ]:{0}.Execute", TYPE_NAME);
}

// SetUp,TearDown,Initializeメソッドも同様に拡張(長くなるので省略)
}

  • 2.拡張した属性をテストクラス、テストメソッドに適用する


[TestFixture]
public class SampleTest {
private readonly string TO_STRING_MESSAGE;
private readonly string TYPE_NAME;

public SampleTest() {
TYPE_NAME = GetType().Name;
TO_STRING_MESSAGE = "☆SampleTest#ToString Hoge";
}

// =========================================================================

///


/// MbUnit3拡張属性を使用したテストメソッド1
/// ※「CustomTestAttribute」を「TestAttribute」の後ろに指定する
///

[Test, CustomTest]
public virtual void TestExecuteTest() {
Console.WriteLine("○{0}.TestExecuteTestが呼び出されました。", TYPE_NAME);
}

///


/// MbUnit3拡張属性を使用したテストメソッド2
///

[Test, CustomTest]
public void TestExecuteTest2() {
Console.WriteLine("○{0}.TestExecuteTest2が呼び出されました。", TYPE_NAME);
}

    // =========================================================================

///


/// 拡張していないテストメソッド
///

[Test]
public void NoCustomTest() {
Console.WriteLine("○{0}.NoCustomTestが呼び出されました。", TYPE_NAME);
}

///


/// テストクラス初期化処理
///

[FixtureInitializer]
public void Initialize() {
Console.WriteLine("○{0}.Initalizeが呼び出されました。",TYPE_NAME);
}

///


/// テストクラスセットアップ処理
///

[FixtureSetUp]
public void FixtureSetUp() {
Console.WriteLine("○{0}.FixtureSetUpが呼び出されました。", TYPE_NAME);
}

///


/// テストクラス終了処理
///

[FixtureTearDown]
public void FixtureTearDown() {
Console.WriteLine("○{0}.FixtureTearDownが呼び出されました。", TYPE_NAME);
}

///


/// テストメソッドセットアップ処理
///

[SetUp]
public void SetUp() {
Console.WriteLine("○{0}.SetUpが呼び出されました。", TYPE_NAME);
}

///


/// テストメソッド終了処理
///

[TearDown]
public void TearDown() {
Console.WriteLine("○{0}.TearDownが呼び出されました。", TYPE_NAME);
}

///


/// インスタンス確認のために拡張
///

///
public override string ToString() {
return TO_STRING_MESSAGE;
}
}
上記テストをGallio上で実行すると下の画像のような結果になります。

枠で囲んだ部分を見ると、SampleTestのSetUp、TearDown、テストメソッドの処理を
CustomTestAttributeのSetUp、TearDown、Executeの中から呼び出せていることが
確認できます。
(Initializeの処理もSetUpより更に前に呼び出されています)


また、拡張属性はテストクラスに対しても適用可能です。

[TestFixture, CustomTest]
public class SampleTest {
// 中身はそのまま
}
実行結果は下記の通りになります。

SampleTestのFixtureInitializer、FixtureSetUp、FixtureTearDownの処理を
CustomTestAttributeのInitialize、SetUp、TearDownの中から同様に
呼び出されていることが確認できます。