在Roslyn VB.NET中缺少我的命名空间

时间:2016-03-14 23:08:31

标签: vb.net roslyn

当我尝试使用Roslyn编译并发出以下VB.NET代码时,

Module Module1
    Sub Main()

        Console.WriteLine(My.Application.Info.AssemblyName)

    End Sub
End Module

我收到以下错误

error BC30451: 'My' is not declared. It may be inaccessible due to its protection level.

MSDN mentions我的命名空间由编译器根据_MYTYPE条件编译常量的值添加。

在Roslyn,我的魔法不再可用了,是吗?

我的代码:

Imports Microsoft.CodeAnalysis
Imports Microsoft.CodeAnalysis.VisualBasic
Imports Microsoft.VisualBasic.CompilerServices

Module Module1
    Sub Main()

        Dim code = "Module Module1" + Environment.NewLine +
                       "Sub Main()" + Environment.NewLine +
                           "System.Console.WriteLine(My.Application.Info.AssemblyName)" + Environment.NewLine +
                       "End Sub" + Environment.NewLine +
                   "End Module"

        Dim tree = VisualBasicSyntaxTree.ParseText(code)

        Dim compilation = VisualBasicCompilation.Create("test").
            AddSyntaxTrees(tree).
            AddReferences(MetadataReference.CreateFromFile(GetType(Object).Assembly.Location)).
            AddReferences(MetadataReference.CreateFromFile(GetType(StandardModuleAttribute).Assembly.Location))

        Dim emitResult = compilation.Emit("test.exe")
        If Not emitResult.Success Then
            Console.Write(String.Join(Environment.NewLine, emitResult.Diagnostics))
        End If

        Console.ReadLine()

    End Sub
End Module

1 个答案:

答案 0 :(得分:3)

如果我理解正确进行的操作,则会在每个编译中自动包含文件VbMyTemplateText.vb来添加@OneToMany @JoinColumn private Set<Ad> ads; 命名空间。为了使它实际生成某些内容,必须正确设置the preprocessor symbol _MYTYPE(对于My的控制台应用程序)。

为了使这项工作,您还需要引用"Console",但之后一切正常:

System.dll