2016-08-31 2 views
1

実行時にRoslynを使用してVB.Netコードをコンパイルするので、分析を行うことができます。エラーRoslynを使用してコンソールアプリケーションを作成するときにBC30420 'Sub Main'が見つかりません

現在、私は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> 

が、これはとVBのコンパイルを行うための正しいアプローチですロザリン、何か不足していますか?

答えて

2

CompilationOptions内のmainTypeNameは、完全修飾されている必要があります(例ではSomeModule.SomeClass)。モジュールに直接か、Sharedである必要があります。

+0

私はこれを試して、これまで動作しませんでした。私はあなたの答えから行った変更を反映するために私の元の質問を更新しました。とにかくおかげさまで提案に感謝します。 – JWT

+1

'Compilation'は不変な型ですので、' compilation.SyntaxTrees.Add(syntaxTree); 'は' compilation'を変更しません。 'Compilation.Create'呼び出しに構文ツリーを追加してみてください。また、いくつかの参照があります(少なくとも 'Object'などの場合はmscorlib.dllになります)。 –

+0

優秀、これは私の問題を解決しました、ありがとう!システムを見つける場所を教えてくれなかったので、私は他のエラーが出ますが、私はそれを期待していました。 – JWT

関連する問題