とりこらぼ。

Learn from yesterday,
live for today,
hope for tomorrow.

目次

Blog 利用状況

ニュース

プロフィール

  • 名前:とりこびと
    とるに足らない人間です。

  • Wankuma MVP
    for '平々凡々'

Web Site

  • Memo(Of T)

もうひとつの Blog

広告っぽい

書庫

日記カテゴリ

Visual Studio 2005 で C♯ライクな Visual Basic のWindowsApplication プロジェクトのテンプレートを作ってみようと試みたけど。

<Attention>
  自分、不器用ですから。
</Attention>

ここのところのエントリで Visual Studio 2005 の Visual Basic の WindowsApplication プロジェクト テンプレートがちょっと自分と合わない気がして、「じゃ、作ればいいんぢゃね?」なんて軽々しくも(後で後悔するハメになりますが、)思ったわけです。どういったものを目指すのかといいますと、

  • Program.vb を生成。内容は以下のとおり。
    Imports System
    Imports System.Windows.Forms
    
    Namespace ルート名前空間
      Public Class Program
        ''' <summary>     ''' アプリケーションのメイン エントリ ポイントです。     ''' </summary>     <STAThread()> _     Public Shared Sub Main()
          Application.EnableVisualStyles()
          Using frm As New Form1
            Application.Run(frm)
          End Using
        End Sub
      End Class
    End Namespace
  • プロジェクト のプロパティの各種設定。
    • スタートアップは [Sub Main](アプリケーション フレームワークは使用しない。)
    • インポートされた名前空間は無し。
    • Option Explicit On、Option Strict On、Option Compare Binary
    • ルート名前空間はコードに出力する。
  • Form1.vb ならびに Form1.Designer.vb を以下のコードで出力。
    Imports System
    
    Namespace ルート名前空間
      Partial Public Class Form1     Inherits System.Windows.Forms.Form
        Public Sub New()       MyBase.New()
          ' この呼び出しは、Windows フォーム デザイナで必要です。       InitializeComponent()
          ' InitializeComponent() 呼び出しの後で初期化を追加します。
        End Sub
      End Class
    End Namespace
    Imports System
    
    Namespace ルート名前空間
      <Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _   Partial Class Form1
        'フォームがコンポーネントの一覧をクリーンアップするために dispose をオーバーライドします。     <System.Diagnostics.DebuggerNonUserCode()> _     Protected Overrides Sub Dispose(ByVal disposing As Boolean)       Try         If disposing AndAlso components IsNot Nothing Then           components.Dispose()         End If       Finally         MyBase.Dispose(disposing)       End Try     End Sub
        'Windows フォーム デザイナで必要です。     Private components As System.ComponentModel.IContainer
        'メモ: 以下のプロシージャは Windows フォーム デザイナで必要です。     'Windows フォーム デザイナを使用して変更できます。       'コード エディタを使って変更しないでください。     <System.Diagnostics.DebuggerStepThrough()> _     Private Sub InitializeComponent()       components = New System.ComponentModel.Container()       Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font       Me.Text = "Form1"     End Sub
      End Class
    End Namespace

とりあえず、情報収集してみました。自分用もかねてリンクです。

MSDN:Visual Studio テンプレート(http://msdn2.microsoft.com/ja-jp/library/6db0hwky(VS.80).aspx)

MSDN:プロジェクト テンプレートの作成(http://msdn2.microsoft.com/ja-jp/library/ms247120(VS.80).aspx)

リンク先を見る限り、テンプレート自体は Visual Studio 2005 のテンプレートのエクスポート機能でさっくり作れそうですね(便利な世の中ですよ、ホントに♪)。でも、ひとつ気になることがあるんですよ。

「ルート名前空間」をどうしようか。

Visual Studio がプロジェクトのプロパティに持っている「ルート名前空間」、C♯だとテンプレートへのパラメータ、Visual Basic だとコンパイラ オプションになっている模様。これをパラメータとして使うといささか困ったことになるんじゃないかと。以前のエントリでも書きましたが、

ここに指定されている「ルート名前空間」は Visual Basic コンパイラにオプションとして渡されてしまうの。

つまり、Visual Studio がプロジェクトのプロパティに Hoge というルート名前空間が設定されていて、かつテンプレートで以下のように Hoge の出力を行った場合、

Namespace Hoge

  Public Class Program
  End Class
End Namespace

この Program クラスは

Hoge.Hoge.Program になっちゃいます。orz

これはテンプレートだけに関することではなく、自分で Namespace ステートメントを記述した場合も同じで、[ルート名前空間].[記述した名前空間]になっちゃいます。逆に言うと、

実際の名前空間はコードに書かれている部分だけでは判断できない (可能性がある。)。

・・・気をつけないといけません。



しかし、今回のテンプレートではどうしたものでしょう。コンパイル オプションを制御する?(できるの?)カスタムパラメータとウィザードでゴソゴソする?(できるの?)

・・・計画は失敗か?(続くかもしれないけど続かないかもしれない。)




※ 中さんのアドバイスによりProgram クラスの内容を変更しました。

投稿日時 : 2007年3月20日 9:50

Feedback

# re: Visual Studio 2005 で C♯ライクな Visual Basic のWindowsApplication プロジェクトのテンプレートを作ってみようと試みたけど。 2007/03/20 10:02 中博俊

Application.EnableVisualStyles
()
Application.Run
(New Form1)

できればこうしましょう。

Application.EnableVisualStyles
()
Using frm as new Form1()
Application.Run
(frm)
End Using

# re: Visual Studio 2005 で C♯ライクな Visual Basic のWindowsApplication プロジェクトのテンプレートを作ってみようと試みたけど。 2007/03/20 10:56 とりこびと

中さんコメントありがとうございます。

C♯のやつそのまんま起こしたんですけど、やっぱりそうですよね。
自身で書いてるコードはそうしてます^^

ということで本文修正しておきます。

# re: Visual Studio 2005 で C♯ライクな Visual Basic のWindowsApplication プロジェクトのテンプレートを作ってみようと試みたけど。 2007/03/20 13:39 通りすがり

Application.Run のヘルプには「このメソッドが返される前に、Form クラスの Dispose メソッドが呼び出されます」と書いていますし、実際、渡した Form はすぐに ApplicationContext に取り込まれるので、私としては using しない方が好きです。

# re: Visual Studio 2005 で C♯ライクな Visual Basic のWindowsApplication プロジェクトのテンプレートを作ってみようと試みたけど。 2007/03/20 14:00 とりこびと

通りすがり さん、コメントありがとうございます。

以前、私のもうひとつのブログでも(おそらく)他の方に同様のコメントいただきました。

自分以外のコードを見る機会が少ないので自分の中でも解が定まらないのですが、実際のところ

Using frm As New Form1

 Application.Run(frm)

End Using

の Using の宣言と Application.Run()メソッドの間って何もしないもんなんですか?
もし、この間で何かするようなことがあるのならUsing は必要かと思うのです。

あ、このように実際の開発コードは場合によりけりですが、今回のコードはテンプレートとしてのベースコードなので書いておいたほうがいいのかなぁって判断しました。
(テンプレートとしての落としどころといった感じでしょうか。)

# もし、もう一度通りすがられましたら、コメントしてやってください。m(_ _)m

# re: Visual Studio 2005 で C♯ライクな Visual Basic のWindowsApplication プロジェクトのテンプレートを作ってみようと試みたけど。 2007/03/20 14:09 とりこびと

ん~。
とはいえ、Visual Studio のテンプレートはそうは書かないんですよね。
通りすがりさんのコメントも好き嫌いを述べておられますし、そういう感覚いいのでしょうか・・・。

# まだまだ足りないものがいっぱいあるなぁ・・・。

# re: Visual Studio 2005 で C♯ライクな Visual Basic のWindowsApplication プロジェクトのテンプレートを作ってみようと試みたけど。 2007/03/20 16:50 通りすがり

> 以前、私のもうひとつのブログでも(おそらく)他の方に同様のコメントいただきました。

別人です(おそらく)。

> Using の宣言と Application.Run()メソッドの間って何もしないもんなんですか?
> もし、この間で何かするようなことがあるのならUsing は必要かと思うのです。

「C♯のやつ」の場合には何もしていないので、それと同じ仕様の場合としてコメントさせていただきました。
何かをするのであれば、私も必要だと思います。
ただこれまで、そのような衝動に駆られたwことはありませんでしたし、もし何かをしたい人がいれば、その人が Using を使うように変更すれば良いのではと思います。

ところで、
> この Program クラスは
> Hoge.Hoge.Program になっちゃいます。orz
ですが、テンプレートに NameSpace を書かなければ良いだけではないのでしょうか?
C# の場合、NameSpace が無ければグローバル名前空間になってしまいますが、VB の場合は既定の名前空間に直接所属するようですので。
(たぶん、とんちんかんなことを書いてしまっていると思いますがw)


> 通りすがりさんのコメントも好き嫌いを述べておられますし、そういう感覚いいのでしょうか・・・。

お察しの通り、私のコメントはあくまで好き嫌いによるものです。
厳密に考えれば、Application.Run の中の new ApplicationContext でエラーが発生すれば、フォームのインスタンスは Dispose されない事になりますが、たぶんそれは C# のテンプレートを作成した人も承知の上だと思います。
テンプレートとしては、とってもとっても小さな確率よりシンプルさを優先させたのではないかなと考えています。

# re: Visual Studio 2005 で C♯ライクな Visual Basic のWindowsApplication プロジェクトのテンプレートを作ってみようと試みたけど。 2007/03/20 17:17 とりこびと

通りすがり さん、コメントありがとうございます。

>何かをするのであれば、私も必要だと思います。
>ただこれまで、そのような衝動に駆られたwことはありませんでしたし、もし何かをしたい人がいれば、その人が Using を使うように変更すれば良いのではと思います。

そうですねぇ。'テンプレートとして'出力するべきか・・・ってところなんですよね。C♯のテンプレに近づけておくのがベターなのか・・・うぅむ。

>テンプレートに NameSpace を書かなければ良いだけではないのでしょうか?

述べられているとおりです。
ただ、今回のテンプレートを作ろうと思ったのは「既定の名前空間」を使用せず、名前空間をコードに落としておきたい、という衝動からなんです。

>C# の場合、NameSpace が無ければグローバル名前空間になってしまいますが、VB の場合は既定の名前空間に直接所属するようですので。(たぶん、とんちんかんなことを書いてしまっていると思いますがw)

つまるところ、この仕様をなんとかできないかなぁって思っています。(実際はちょっと無理そうな気配がしてきているんですが。orz)

>> 通りすがりさんのコメントも好き嫌いを述べておられますし、そういう感覚いいのでしょうか・・・。
>お察しの通り、私のコメントはあくまで好き嫌いによるものです。

あ、「好みの問題だからイチャモンつけんなや!」ってことではありませんので。m(_ _)m
(分かっていただけていると思っていますが、文章って強弱まで伝えきれないものですので。)

>厳密に考えれば、Application.Run の中の new ApplicationContext でエラーが発生すれば、フォームのインスタンスは Dispose されない事になりますが、たぶんそれは C# のテンプレートを作成した人も承知の上だと思います。

このあたり、'テンプレートだからこそちゃんとしておいてほしい'って気もしなくもないんですよねぇ。

>テンプレートとしては、とってもとっても小さな確率よりシンプルさを優先させたのではないかなと考えています。

しかし、これを納得してしまう自分がいるということが事実・・・なのかなぁ。


# あぁ~むずがじ~。

# re: Visual Studio 2005 で C♯ライクな Visual Basic のWindowsApplication プロジェクトのテンプレートを作ってみようと試みたけど。 2007/03/20 17:24 とりこびと

ちょっとエントリにしてみます。m(_ _)m

# 隣の Sub Main はどんなんか~な~? 2007/03/20 17:49 とりこびと ぶろぐ。

隣の Sub Main はどんなんか~な~?

# re: Visual Studio 2005 で C♯ライクな Visual Basic のWindowsApplication プロジェクトのテンプレートを作ってみようと試みたけど。 2007/03/20 17:50 とりこびと

↑そのエントリです。

# Visual Studio テンプレートを作成する。 - プロジェクト テンプレート編 - その1。 2007/03/22 10:17 とりこびと ぶろぐ。

Visual Studio テンプレートを作成する。 - プロジェクト テンプレート編 - その1。

タイトル
名前
Url
コメント