2

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フレームワークを可能な限り活用したいと思います。

4

2 に答える 2

1

OK、答えはありません:(フレームワークは私がやりたいことをしていないと思います。Regexを使用してImportsステートメントを挿入する私のハッキーなソリューションは次のとおりです。

sourceCode = AddImportsIfNeeded(sourceCode, "System.Data")


Private Function AddImportsIfNeeded(ByVal sourceCode As String, ByVal namespaceToImport As String) As String

    If Not Regex.IsMatch(sourceCode, "^\s*Imports\s+" & Regex.Escape(namespaceToImport) & "\s*$", RegexOptions.Multiline) Then
        Return "Imports " & namespaceToImport & vbNewLine & sourceCode
    End If
    Return sourceCode

End Function

ファイルに Option ステートメント (Option Strict On など) が含まれている場合、これは機能しないことに注意してください。Imports ステートメントは、Option ステートメントの下にある必要があります。

于 2012-11-01T03:55:27.497 に答える