主婦と.NETと犬のぶろぐ

奥様 と プログラム と お犬様 の 楽しい日常

目次

Blog 利用状況

ニュース

書庫

日記カテゴリ

CodeDom で遊んでみた。

ひまひまシリーズその 3。
今更ながら、System.CodeDom 名前空間の下のいくつかのクラスを使って
プログラムを組んでみました。
これ、慣れるまでには何回か組まないとコツがつかめないっぽい。
脳内でジェネレートされるプログラムを組み立てながらやったので(こんなお粗末なプログラムだが...)そのせいかも。

でも簡単な奴だったら Text ファイルなんかにテンプレート書いておいて
String.Format でやった方が楽かもしれない。

しかし、System.CodeDom.Compiler.CodeDomProvider に突っ込むオブジェクトの実態によって
C# やら VB やら複数種類のコード出力が可能なのは結構魅力的だと思いました。

ちょっと疑問な点が。
・コードに出力される Option Strict とかの設定はいったいどのオブジェクトがもっているの?
 Microsoft.VisualBasic.VBCodeProvider が持っててよさそうな感じはするんだけどなぁ。
・Property の Set にパラメータが生成されない。CodeAssignStatement じゃだめなの?

CodeDomTest.vb

Public Class CodeDomTest
    Public Sub Generate()
        Dim compileUnit As System.CodeDom.CodeCompileUnit = _
        New System.CodeDom.CodeCompileUnit()

' NameSpace Dim nmspace As System.CodeDom.CodeNamespace = _ New System.CodeDom.CodeNamespace("CodeDomTry") compileUnit.Namespaces.Add(nmspace)
' Imports nmspace.Imports.Add( _ New System.CodeDom.CodeNamespaceImport("System"))
' Class Dim cls As System.CodeDom.CodeTypeDeclaration = _ New System.CodeDom.CodeTypeDeclaration("CodeDomSample") nmspace.Types.Add(cls) cls.Comments.Add(New System.CodeDom.CodeCommentStatement("これはクラスヘッダのコメント")) cls.IsClass = True ' Inherits cls.BaseTypes.Add(GetType(Object)) ' Implements(VB の場合最後に付ける) cls.BaseTypes.Add(GetType(IDisposable))
' Constructor Dim constructor As System.CodeDom.CodeConstructor = _ New System.CodeDom.CodeConstructor() cls.Members.Add(constructor) constructor.Attributes = CodeDom.MemberAttributes.Public constructor.Comments.Add(New System.CodeDom.CodeCommentStatement("これはコンストラクタのコメント")) ' CodeConstructor の場合、自動で MyBase.New() が付加される。New という名前も勝手に付けてくれる 'constructor.Statements.Add( _ 'New System.CodeDom.CodeMethodInvokeExpression( _ ' New System.CodeDom.CodeBaseReferenceExpression(), "New", New System.CodeDom.CodeExpression() {}))
' Field Dim field As System.CodeDom.CodeMemberField = _ New System.CodeDom.CodeMemberField(GetType(String), "m_propertyTest") cls.Members.Add(field) field.Comments.Add(New System.CodeDom.CodeCommentStatement("これはメンバ変数のコメント"))
' Property Dim prop As System.CodeDom.CodeMemberProperty = _ New System.CodeDom.CodeMemberProperty() cls.Members.Add(prop) prop.Comments.Add(New System.CodeDom.CodeCommentStatement("これはプロパティのコメント")) prop.Name = "PropertyTest" prop.Type = New System.CodeDom.CodeTypeReference(GetType(String)) prop.Attributes = CodeDom.MemberAttributes.Public
Dim getter As System.CodeDom.CodeMethodReturnStatement = _ New System.CodeDom.CodeMethodReturnStatement() getter.Expression = New System.CodeDom.CodeFieldReferenceExpression( _ New System.CodeDom.CodeThisReferenceExpression(), field.Name) prop.GetStatements.Add(getter)
Dim setter As System.CodeDom.CodeAssignStatement = _ New System.CodeDom.CodeAssignStatement() setter.Left = New System.CodeDom.CodeFieldReferenceExpression( _ New System.CodeDom.CodeThisReferenceExpression(), field.Name) setter.Right = New System.CodeDom.CodePropertySetValueReferenceExpression() prop.SetStatements.Add(setter)
' Method Dim method As System.CodeDom.CodeMemberMethod = _ New System.CodeDom.CodeMemberMethod() cls.Members.Add(method) method.Comments.Add(New System.CodeDom.CodeCommentStatement("これはメソッドヘッダのコメント")) method.Name = "TestMethod" method.ReturnType = New System.CodeDom.CodeTypeReference(GetType(String)) method.Attributes = CodeDom.MemberAttributes.Public
Dim methodParameter As System.CodeDom.CodeParameterDeclarationExpression = _ New System.CodeDom.CodeParameterDeclarationExpression(GetType(Date), "value") method.Parameters.Add(methodParameter)
Dim methodComment As System.CodeDom.CodeCommentStatement = _ New System.CodeDom.CodeCommentStatement("これはメソッド内のコメントです") method.Statements.Add(methodComment)
Dim methodResultStatement As System.CodeDom.CodeMethodReturnStatement = _ New System.CodeDom.CodeMethodReturnStatement( _ New System.CodeDom.CodeMethodInvokeExpression( _ New System.CodeDom.CodeTypeReferenceExpression(methodParameter.Name), _ "ToString", New System.CodeDom.CodePrimitiveExpression("yyyy/MM/dd HH:mm:ss"))) method.Statements.Add(methodResultStatement)
' Implementation Method Dim methodImple As System.CodeDom.CodeMemberMethod = _ New System.CodeDom.CodeMemberMethod() cls.Members.Add(methodImple) methodImple.Name = "Dispose" methodImple.Attributes = CodeDom.MemberAttributes.Public methodImple.ImplementationTypes.Add(GetType(IDisposable)) methodImple.Statements.Add(New System.CodeDom.CodeCommentStatement("TODO:実装してください"))
' Override Method Dim methodoverride As System.CodeDom.CodeMemberMethod = _ New System.CodeDom.CodeMemberMethod() cls.Members.Add(methodoverride) methodoverride.Name = "ToString" methodoverride.ReturnType = New System.CodeDom.CodeTypeReference(GetType(String)) methodoverride.Attributes = CodeDom.MemberAttributes.Public Or CodeDom.MemberAttributes.Override methodoverride.Statements.Add(New System.CodeDom.CodeMethodReturnStatement( _ New System.CodeDom.CodeFieldReferenceExpression( _ New System.CodeDom.CodeThisReferenceExpression(), field.Name)))
' Generate Dim provider As System.CodeDom.Compiler.CodeDomProvider = _ New Microsoft.VisualBasic.VBCodeProvider 'New Microsoft.CSharp.CSharpCodeProvider() Dim generateOptions As System.CodeDom.Compiler.CodeGeneratorOptions = _ New System.CodeDom.Compiler.CodeGeneratorOptions() generateOptions.BlankLinesBetweenMembers = True generateOptions.IndentString = ControlChars.Tab generateOptions.VerbatimOrder = True
provider.GenerateCodeFromCompileUnit(compileUnit, Console.Out, generateOptions) End Sub End Class

生成されたコード


'------------------------------------------------------------------------------
' <auto-generated>
'     このコードはツールによって生成されました。
'     ランタイム バージョン:2.0.50727.832
'
'     このファイルへの変更は、以下の状況下で不正な動作の原因になったり、
'     コードが再生成されるときに損失したりします。
' </auto-generated>
'------------------------------------------------------------------------------

Option Strict Off Option Explicit On
Imports System
Namespace CodeDomTry
'これはクラスヘッダのコメント Public Class CodeDomSample Inherits Object Implements System.IDisposable
'これはコンストラクタのコメント Public Sub New() MyBase.New End Sub
'これはメンバ変数のコメント Private m_propertyTest As String
'これはプロパティのコメント Public Overridable Property PropertyTest() As String Get Return Me.m_propertyTest End Get Set Me.m_propertyTest = value End Set End Property
'これはメソッドヘッダのコメント Public Overridable Function TestMethod(ByVal value As Date) As String 'これはメソッド内のコメントです Return value.ToString("yyyy/MM/dd HH:mm:ss") End Function
Public Overridable Sub Dispose() Implements System.IDisposable.Dispose 'TODO:実装してください End Sub
Public Overrides Function ToString() As String Return Me.m_propertyTest End Function End Class End Namespace

投稿日時 : 2007年9月27日 16:33

Feedback

# re: CodeDom で遊んでみた。 2007/09/27 16:35 シャノン

CodeDom からコードを生成するのはいいんですが、コードから CodeDom を生成する方法がありません。どうにも絶望です。

# re: CodeDom で遊んでみた。 2007/09/27 16:37 囚人

>CodeDom からコードを生成するのはいいんですが、コードから CodeDom を生成する方法がありません。どうにも絶望です

コンパイラになってしまう。

# re: CodeDom で遊んでみた。 2007/09/27 16:50 επιστημη

おもしょいなー♪
Attributeのくっつけかたも教えてくれさい。
テストコードの自動生成みたいなことやれそな希ガス。

# re: CodeDom で遊んでみた。 2007/09/27 17:20 なおこ(・∀・)

>> シャノンさん、囚人さん
卵と鶏?

>> επιστημη さん
' Class
Dim cls As System.CodeDom.CodeTypeDeclaration = _
New System.CodeDom.CodeTypeDeclaration("CodeDomSample")
'nmspace.Types.Add(cls)
cls.CustomAttributes.Add(New System.CodeDom.CodeAttributeDeclaration( _
New System.CodeDom.CodeTypeReference(GetType(System.ObsoleteAttribute)), _
New System.CodeDom.CodeAttributeArgument("", New System.CodeDom.CodePrimitiveExpression("このクラスは古いです"))))

こうすると、
出力時に
<System.ObsoleteAttribute("このクラスは古いです")> _
Public Class CodeDomSample
となります。

クラスやらメソッドやらのオブジェクトの
CustomAttributes プロパティに Add してやればよさげみたいです。
...こういう事であってますか...?

# re: CodeDom で遊んでみた。 2007/09/27 19:33 επιστημη

あっざーす。それでぢゅーぶんです。

# re: CodeDom で遊んでみた。 2007/09/28 0:56 Streetw☆

CodeDomって知ってても使ったこと無かったので勉強になりました~
恩返し(?)ができればと、いろいろ探し回って見ました。
#なおこ(・∀・) さんのエントリが増えるんだったら、ひまひまなのも悪くないかもって不謹慎なことを考えながらw

>コードに出力される Option Strict とかの設定
UserDataみたいです。

'Option Strict On は…
compileUnit.UserData("RequireVariableDeclaration") = True
'Option Explicit On は…
compileUnit.UserData("AllowLateBound") = False

>Property の Set にパラメータが生成されない。
CodeDomにはSetのパラメータを付ける機能は無いみたいですね。

ここのコメント欄でほんの少しだけ触れられていました。
この人達、誰か知らないけどw
http://www.devcity.net/Articles/71/codedom_1.aspx

VBの文法上、C#と同じく引数の記述は不要みたいで、付くのはVSの心遣いwのようです。
生成されたコードをVSに貼り付けると、自動的に追加されますね。

試しに、VSのオプションの「テキストエディタ」の「Basic」の「VB 固有」のところで「コードの再フォーマット」のチェックを外すと、Setと書いても引数が自動的に付けられたりせず、付けなくてもビルドは正常にできました。

# re: CodeDom で遊んでみた。 2007/09/28 11:11 シャノン

> コンパイラになってしまう。

うんうん。
コンパイラっちゅーよりも構文木つくるとこまででいいんですけどね。
コンパイラになってしまっていいじゃないですか。っていうか、コンパイラのコードを流用すればできるのに、なんでやってくれないんですかと。

# re: CodeDom で遊んでみた。 2007/09/28 16:49 なおこ(・∀・)

>> επιστημη さん
よかったです。

>> Streetw☆ さん
情報ありがとうございます。勉強になります。
Option Strict とかの設定、そんな隠れたところに持たんでも、、、という感じですね。

Set メソッドについて触れていると教えてくださったページは結構詳しく CodeDom について書いていますね。

たしかに、生成したコードをそのままコンパイルしても
VB コンパイラには何も怒られないのは確認してました。
きもりわりぃですけどねw

>> シャノンさん
この本が結構おもしろいと VB コンパイラ開発に携わった方に教えてもらったのですが、
http://www.amazon.com/Code-Generation-Microsoft-Kathleen-Dollard/dp/1590591372
興味はあるものの、実物がかなり分厚い英語の書籍なので
まだ手を出せないでいます。。。
誰か翻訳書籍を書いてくれないかなぁ。

# re: 無意味なコメント(前回ソースゴミのエントリーの延長線) 2017/07/24 11:43 zzzzz

http://www.nbajerseys.us.org/
http://www.pandorajewelryoutlets.in.net/
http://www.uggboots-forwomen.in.net/
http://www.nikeshoes2017.us.com/
http://www.michaelkors-handbags.org.uk/
http://www.nikeshoesoutlet.us.org/
http://indianapoliscolts.jerseyscheap.us.com/
http://www.louisvuitton-sacpascher.fr/
http://www.dolceandgabbana.in.net/
http://www.cheapray-banssunglasses.us.com/
http://chicagobears.jerseyscheap.us.com/
http://www.coachoutlet-storeonline.com.co/
http://www.fitflopssale-clearances.us.com/
http://www.uggsforwomen.eu.com/
http://www.kate-spadehandbags.us.com/
http://www.true-religionoutlets.us.com/
http://www.eccoshoesoutlet.us/
http://www.nikehuarache2017.in.net/
http://www.montblancpensoutlet.com.co/
http://www.nikestores.org.uk/
http://www.chaussurelouboutinpas-cher.fr/
http://atlantafalcons.jerseyscheap.us.com/
http://www.christianlouboutinoutlets.us/
http://www.nhljerseyswholesaler.us.com/
http://www.fitflopsclearancesale.us.com/
http://www.polo-outlets.us.com/
http://newenglandpatriots.jerseyscheap.us.com/
http://www.nikeoutlet-stores.us.com/
http://www.nikeblazerlow.fr/
http://www.nikefactorystore.us.com/
http://www.prada-shoes.us.com/
http://www.replicawatchesforsale.us.com/
http://www.redvalentino.in.net/
http://www.ugg-slippers.de.com/
http://www.uggs-forwomen.de.com/
http://www.conversetrainer.org.uk/
http://www.uggs-onsale.eu.com/
http://sanfrancisco49ers.jerseyscheap.us.com/
http://www.cheapjordanshoes.in.net/
http://neworleanssaints.jerseyscheap.us.com/
http://www.truereligionjeansoutletonline.us.com/
http://www.ugg-slippers.eu.com/
http://www.michaelkors-handbagswholesale.in.net/
http://www.new-balanceshoes.in.net/
http://www.michaelkorshandbagswholesale.in.net/
http://www.ralph-laurenoutlets.us.com/
http://miamidolphins.jerseyscheap.us.com/
http://www.coachoutletstore-online.eu.com/
http://www.raybanssunglasses.net.co/
http://www.oakleysunglassesoutlete.us.com/

# yezi20160620@163.com 2017/09/27 18:40 wwwww

http://www.reebokoutlet.us.org
http://www.adidastubular.us.com
http://www.nikezoom.us.com
http://www.airmax90.us.org
http://www.nike-airmax90.uk
http://www.nikemercurial.us.com
http://www.basketball-shoes.us.com
http://www.converseoutlet.us.com
http://www.airjordan.us.com
http://www.jordan11retro.us.com
http://www.michaelkorshandbagssale.us.org
http://www.nikezoom.me.uk
http://www.jordanshoes.uk
http://www.nfljerseys.us.org
http://www.adidasstansmith.uk
http://www.adidasultraboost.us.org
http://www.lacosteonlineshop.us.com
http://www.jordan6.us.com
http://www.jordan4.us.com
http://www.adidas-eqt.us.com
WWW

# re: [Tips][Visual Studio]Visual Studio 2008で、ソースコードの行数をカウントする方法 2017/09/29 9:53 chenlina

http://www.oakleysunglassessport.us.com
http://www.longchampoutlet-online.com
http://www.uggbootsclearances.com.co
http://www.truereligionjeans-outlet.us.com
http://www.truereligionsale.com.co
http://www.ray-bansunglassesoutlets.us.com
http://www.ugg.com.co
http://www.louisvuitonnoutlet.com
http://www.hollisterclothing.us.org
http://www.northfaceoutletstore.us.org
http://www.hermesoutlets.us.com
http://www.outletugg.com.co
http://www.canadagoosesale.com.co
http://www.cheap-jordan-shoes.us.com
http://www.newbalance-shoes.us.com
http://www.pololaurenshirts.com
http://www.michaelkorsoutletsonlinesale.us.com
http://www.wwwuggaustralia.co.uk
http://www.pandora-charms-canada.ca
http://www.swarovski-jewelry.name
http://www.ugg-outlets.com.co
http://www.coachoutlet70off.us.com
http://www.truereligion-jeans.com.co
http://www.michaelkorsoutletoff.us.com
http://www.fitflops.org
http://www.coachoutletonlineshopping.us.org
http://www.baseballjerseys.us.com
http://www.toryburchoutletsonline.us.com
http://www.northfacejacket.us.com
http://www.ugg.me.uk
http://www.ray-bansunglassesoutlet.com.co
http://www.ray-bansunglasses2017.us.com
http://www.ralphlaurenoutlet-poloshirts.us.com
http://www.oakleysunglassesofficialsite.us.com
http://www.ralphlauren.eu.com
http://www.poloralphlaurenoutletoff.us.com
http://www.uggboots-onsale.us
http://www.oakleysunglasses2017.us.com
http://www.nikeblazers.us
http://www.pandorajewelryoutlet.us.org
http://www.cheapjordansshoes.us.com
http://www.nikeairjordans.co.uk
http://www.uggbootsaustralia.in.net
http://www.salomon-shoes.in.net
http://www.uggsaustraliaboots.us.com
http://www.uggsclassicboots.us.com
http://www.ugg-italia.it
http://www.hermesbirkinhandbags.us.com
http://www.christianlouboutin.name
http://www.tommy-hilfiger-canada.ca
http://www.uggsadd.com
http://www.mlbjerseyswholesale.us.com
http://www.nikerosherunsale.co.uk
http://www.officialcoachfactoryoutletonline.us.com
http://www.canadagoose.com.co
http://www.michaelkorsuk.me.uk
http://www.raybanpascher.fr
http://www.nikeoff.com
http://www.ferragamooutlet.us.com
http://versace.sunglassescheap.us.com
http://www.ray-ban-sunglasses.com.au
http://www.jordans-fusion.com
http://www.coach-outlet.nom.co
http://www.adidasoutletstore.net
http://www.wholesale-nfl-jerseys.us
http://www.adidasstansmith.co.uk
http://www.oakley-sunglassesonsale.us.com
http://www.michaelkors--outlet.us.org
http://www.ukuggboots.co.uk
http://www.outletthenorthface.us.com
http://www.pandoracharmjewelry.us.com
http://www.coachoutletstoreonlineofficial.us.com
http://www.burberryoutlet-canada.ca
http://www.uggsaustralia.it
http://www.northface-clearance.us
http://www.fitflopssaleclearance.us.org
http://www.uggfactoryoutlet.com.co
http://www.redbottoms.org.uk
http://www.michaelkorshandbags.nom.co
http://www.burberryusa.us.com
chenlin20170929

# re: CodeDom で遊んでみた。 2017/11/28 12:00 cc

http://www.nike-airmax2017.us.com
http://www.vans-outlet.us.com
http://www.yeezy-shoes.us
http://www.supremeclothing.us
http://www.nikedunks.us.org
http://www.yeezyshoes.org.uk
http://www.guccibelt.us.com
http://www.longchamphandbags.us.org
http://www.kobebasketballshoes.us.com
http://www.adidasyeezy.co.uk
http://www.goyardhandbags.us.com
http://www.fitflops.cc
http://www.kyrie4.org
http://www.nike-airforce1.us.com
http://www.adidas-tubular.us.com
http://www.yeezyboost.com.co
http://www.curry4.us.com
http://www.longchampbags.us.org
http://www.hermesbelts.com
http://www.adidasultra.us.com
http://www.lebronjames-shoes.us.com
http://www.yeezy.org.uk
http://www.jordan12.us.com
http://www.hermes-belt.us.com
http://www.adidas-tubular.us.com
http://www.linksoflondon.us.com
http://www.retro-jordans.us.com
http://www.lebron15.net

# re: VB.NET で C# の { } 空ブロックと同じことをするには? 2018/01/04 13:58 chenlina

http://www.michaelkorsinc.us.com
http://www.adidaswings.name
http://www.outletcanadagoosesale.us.com
http://www.louboutin.uk
http://www.timberland.us.org
http://www.ferragamooutlet.us.com
http://www.nikeairmax.me.uk
http://www.swarovski-jewelry.us
http://www.ralphlaurencom.us.com
http://www.pradabags.in.net
http://www.christian--louboutin.us
http://www.cheapreplicawatches.us.com
http://www.rayban.in.net
http://www.thenorthfaceoutlet.ca
http://www.oakleysunglassescom.us.com
http://www.uggbootssaleoutlet.us.com
http://www.michaelkorsoutlet.us
http://www.pandoracharmjewelry.us.com
http://www.montblanc.com.co
http://www.thenorthfaceuk.co.uk
http://www.truereligionsale.com.co
http://www.doudounecanadagooseenfant.fr
http://www.michaelkorsoutlet70off.us.com
http://www.ugg.com.co
http://www.michaelkorsonline-outlet.us.com
http://www.raybansunglassesoutlet.net.co
http://www.timberlandoutlet.us.org
http://www.converseshoesoutlet.us.com
http://www.ralphlauren-poloshirts.co.uk
http://www.uggcanadaoutlet.ca
http://www.toryburchoutletoff.us.com
http://www.uggoutletinc.us.com
http://www.truereligionoutletjeans.us
http://www.ralphlaurenoutletofficial.us.com
http://www.truereligion-jeans.us
http://www.wholesaleoakleysunglasses.us.org
http://www.fitflops.org
http://www.soccerjersey.us.com
http://www.pandorajewelrycanada.ca
http://www.coachhandbagsfactoryoutletonline.us.com
http://www.outletcanadagoose.ca
http://www.vibram-fivefingers.us.com
http://www.ralphlauren.in.net
http://www.ugg-bootsonline.us.com
http://www.canadagoosecom.us.com
chenlina20180104

# re: INI 編集ツール IniModifier を作成してみる (1) 2018/07/31 14:32 chenyingying

http://www.undefeated.us.com
http://www.fitflopss.us.com
http://www.soldier11.com
http://www.pasottiombrelli.us
http://www.adidasyeezy350.us.com
http://www.coachoutletfactoryofficial.us.com
http://www.longchampoutlet-store.us.com
http://www.outletcanadagoosesale.us.com
http://www.coachfactoryoutlet-online.eu.com
chenyingying20180731メ

タイトル  
名前  
Url
コメント