DOBON.NET DOBON.NETプログラミング掲示板過去ログ

CodeDomProviderによるWindowsアプリケーションの生成

環境/言語:[OS : Windows XP Professional / 言語 : Visual Basic .NET / .NET Framework : 2.0]
分類:[.NET]

【解決したい問題】

CodeDomProviderによるvb.netのコンパイラーを作成しています。
Windowsアプリケーションをコンバイルしたいのですが
CompilerParametersの.GenerateExecutableをTrueにしても
コマンドラインの実行ファイルしか作成できません。

Windowsアプリケーションをコンパイルする方法があれば、教えてください。

【解決するために何をしたか】

CodeDomProviderで生成されるコマンドを覗いたところ
vbc.exe /t:exeとなっています。これが/t:winとなればWindowsアプリケーションが作成されることは知っています。

コマンドラインを書き、shell()で実行する方法であれば、できるのかなぁと想像しています。しかし、CodeDomProviderで実現できれば、後からの変更も簡単なため、そちらの方法を探しています。

【追加事項】

コードは、tipsにあったものを利用しています。
なお、2つのファイル(FileID,FileName)を埋め込んでいます。

'CodeProviderクラスはSystem.CodeDom.Compiler.CodeDomProviderの派生クラス
Dim codeProvider As System.CodeDom.Compiler.CodeDomProvider
' VBのCodeProviderインスタンス作成
codeProvider = New Microsoft.VisualBasic.VBCodeProvider

' 作成したCodeProviderから、ICodeCompilerインターフェイスを取得
'Dim codeCompiler As System.CodeDom.Compiler
'codeCompiler = codedomProviderpiler

' コンパイラパラメータ
Dim compilerParameters As New System.CodeDom.Compiler.CompilerParameters

With compilerParameters
'参照するdllを設定する
.ReferencedAssemblies.Add("System.dll")
.ReferencedAssemblies.Add("System.Data.dll")
.ReferencedAssemblies.Add("System.Deployment.dll")
.ReferencedAssemblies.Add("System.Drawing.dll")
.ReferencedAssemblies.Add("System.Windows.Forms.dll")
.ReferencedAssemblies.Add("System.Xml.dll")
'埋め込みリソース
.EmbeddedResources.Add(InputFilePath)
.EmbeddedResources.Add(Directory.GetCurrentDirectory & "\FileId")
.EmbeddedResources.Add(Directory.GetCurrentDirectory & "\FileName")
' 実行可能ファイルを作成する
.GenerateExecutable = True
' 出力ファイルを設定
.OutputAssembly = strOutputAssembly
' デバッグ情報を含めない
.IncludeDebugInformation = True
End With

' コンパイル結果を取得するためのクラス ( CompileAssemblyFromSource()メソッドの戻り値 )
Dim compilerResults As System.CodeDom.Compiler.CompilerResults

Try
' コンパイル開始 ( ファイルからコンパイルする場合はCompileAssemblyFromFile()メソッドを用いる )
compilerResults = codeProvider.CompileAssemblyFromSource(compilerParameters, strSourceCode)
Catch ex As Exception
' 出力ペインに表示
Return ("例外がスルーされました。" + vbNewLine + ex.Message)
End Try
コンパイラに依存することになってしまいますが、CompilerParameters.CompilerOptions に書いてやればいいかと。

ところで、
> ' デバッグ情報を含めない
> .IncludeDebugInformation = True
含めろ、と指示しているように見えますが……。
■No19028に返信(Hongliangさんの記事)

Hongliangさん、アドバイスをありがとうございます。

.CompilerOptions = "/t:winexe"

を追加したところ、コンパイルできました。

しかし、コンパイルしたファイル(.exe)をダブルクリックしても
System.Resources.MissingManifestResourceException
がスローされ、動作しません。

ヘルプで調べたところ
「メイン アセンブリにニュートラル カルチャ リソースが含まれていないとスローされる例外。」
とありました。

引き続き取り組んでみます。
これまでアセンブリ、リソース、カルチャ、シグニチャといったものに拒絶反応を示してきたので、正面から取り組まないといけないのかもしれません。

もう少々お付き合いください。
<<経過>>
その後、コンパイル対象のファイル(.vb)を別名で新しく作成したところしたと生成されたアセンブリも動作するようになりました。

ただ動作が不安定なため、
「FUSLOGVW.exe」というツールで解析を続けています。

<<プログラムの状況>>
生成されたアセンブリを実行すると
[アセンブリファイル名].resource
をバインドしに行きます。
このリソースファイルは、何処にもないため
見つからずにエラーになります。

<<質問の内容>>
■このリソースファイルは必須なのでしょうか?
■コンパイル時にこのリソースファイルも生成させて、アセンブリに埋め込むことはできますか?また、実行時に、埋め込んだものを読み取らせることはできるのでしょうか?

<<備考>>
アセンブリについて勉強中です。
質問の内容がとんちんかんであれば、指摘いただける幸いです。
> ■このリソースファイルは必須なのでしょうか?
CodeDOM コンパイルの対象となるソース次第です。

> ■コンパイル時にこのリソースファイルも生成させて、アセンブリに埋め込むことはできますか?また、実行時に、埋め込んだものを読み取らせることはできるのでしょうか?
可能です。CodeDOM コンパイルの対象となるソースが利用するリソースを把握しているのなら、ですが。VS で作成されたコードなら同じプロジェクト内に resx ファイルが存在しているでしょうけど(resx ファイルから resources ファイルを実行時に作成するには……詳しくないですが、ResXResourceReader と ResourceWriter とか使えばいいんですかね)。
どこのリソースを使うかは CodeDOM コンパイルの対象となるソース次第です。普通は埋め込まれている事を期待するでしょう。

CodeDOM 以前に、コンパイル対象のソースの解読が必要な気がします。
Hongliangさん

また、アドバイスをありがとうございます。

「どこのリソースを使うかは CodeDOM コンパイルの対象となるソース次第です。」
なるほどっ、必須ではないのかぁーー
コンパイルするアプリは配布したいので
環境に依存しないようにしたい状況です。

リソースが必要になるケースについて調べてみます。

また、必要であれば
VSで作られた.resxを、教えていただいたクラスクラスなどで生成できるか試してみます。

まずは、お礼まで。

DOBON.NET | プログラミング道 | プログラミング掲示板