当我尝试使用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
答案 0 :(得分:3)
如果我理解正确进行的操作,则会在每个编译中自动包含文件VbMyTemplateText.vb
来添加@OneToMany
@JoinColumn
private Set<Ad> ads;
命名空间。为了使它实际生成某些内容,必须正确设置the preprocessor symbol _MYTYPE
(对于My
的控制台应用程序)。
为了使这项工作,您还需要引用"Console"
,但之后一切正常:
System.dll