VBソースファイルをメモリにロードしようとしています。ただし、VBファイルは、関連付けられているプロジェクトに、プロジェクトレベルで定義されたグローバルな「インポートされた名前空間」があることを前提としています。このVB機能を使用すると、個々のファイルで、すべてのファイルのImportsステートメント(C#での使用)を省略できます。
Dim sourceCode As String = ""
'sourceCode &= "Imports System.Data" & vbNewLine
sourceCode &= "Class Foo" & vbNewLine
sourceCode &= "Sub Print()" & vbNewLine
sourceCode &= "Dim dtbl As DataTable" & vbNewLine
sourceCode &= "System.Console.WriteLine(""Hello, world!"")" & vbNewLine
sourceCode &= "End Sub" & vbNewLine
sourceCode &= "End Class" & vbNewLine
Dim compiler As New Microsoft.VisualBasic.VBCodeProvider
Dim params As New Compiler.CompilerParameters
params.ReferencedAssemblies.Add("System.dll")
params.ReferencedAssemblies.Add("System.Data.dll")
params.ReferencedAssemblies.Add("System.Xml.dll")
params.GenerateInMemory = True
params.GenerateExecutable = False
Dim results As Compiler.CompilerResults = compiler.CompileAssemblyFromSource(params, sourceCode)
If results.Errors.Count > 0 Then
For Each compileError In results.Errors
Console.WriteLine(compileError.ToString)
Next
Return
End If
Dim assembly = results.CompiledAssembly
2行目はコメント化されています。これをコメント解除してImportsステートメントを追加すると、コードは正常に機能します。「DimdtblAsDataTable」を「DimdtblAsSystem.Data.DataTable」に変更しても正常に機能します。
そのコード行のコメントを解除する代わりに、このImportsステートメントをグローバルプロジェクトレベルのインポートされた名前空間であるかのようにコンパイラーまたはパラメーターにフィードする方法はありますか?
このImportsステートメントを読み込んだ各ファイルの先頭に追加するだけで済みます。しかし、すでにそこにある場合は、Importsステートメントが重複しているというエラーが表示されます。Importsステートメントがすでに存在するかどうかを確認するために正規表現チェックを行うことはできますが、System.CodeDomフレームワークを可能な限り活用したいと思います。