我正在使用Roslyn在运行时编译VB.Net代码,以便我可以做一些分析。
目前我正努力让编译工作,因为它声称无法找到Sub Main。它在我作为DLL编译时声称成功,但在引用时我无法在对象浏览器中看到任何导致我认为它也无法正常工作的内容。
var compilationOptions = new VisualBasicCompilationOptions(OutputKind.ConsoleApplication, mainTypeName: "SomeModule");
var compilation = VisualBasicCompilation.Create("ExampleCompilation", null, null, compilationOptions);
var syntaxTree = VisualBasicSyntaxTree.ParseText(@"
Imports System
Module SomeModule
''' <summary>
''' This is the summary for Main()
''' </summary>
Public Sub Main()
Console.WriteLine(""Hello World"")
End Sub
End Module
");
compilation.SyntaxTrees.Add(syntaxTree);
EmitResult er = null;
using (Stream xmlStream = new StreamWriter("output.xml").BaseStream)
using (Stream peStream = new FileStream("output.exe", FileMode.Create))
{
er = compilation.Emit(peStream, null, xmlStream, null, null, new EmitOptions());
}
if (er.Success)
{
Console.WriteLine("SUCCESS");
}
else
{
Console.WriteLine("FAILURE");
Console.WriteLine(string.Join("\n", er.Diagnostics));
}
此代码输出标题中的错误(BC30420),生成0字节可执行文件,以及包含以下内容的xml文件:
<?xml version="1.0"?>
<doc>
<assembly>
<name>
ExampleCompilation
</name>
</assembly>
<members>
</members>
</doc>
这是使用Roslyn进行VB编译的正确方法还是我遗漏了什么?
答案 0 :(得分:2)
CompilationOptions中的mainTypeName
应该是完全限定的(在您的示例中为“SomeModule.SomeClass”),并且必须直接在模块中或Shared
。