2016-03-14 69 views
3

當我嘗試編譯併發出使用羅斯林以下VB.NET代碼,想念我的命名空間羅斯林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條件編譯常量的值添加。

在羅斯林那一切我的魔法不再可用,是嗎?

我的代碼:

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

你加什麼參考? –

+0

@ KevinPilch-Bisson mscorlib和Microsoft.VisualBasic.dll –

+0

我相信My.Application的東西是特定於Winforms和WPF的,所以你必須從那裏獲得一些參考。 –

回答

2

如果我沒有理解什麼是正確的事情,在My命名空間是通過自動包括文件VbMyTemplateText.vb到每個編輯添加。爲了使它實際上產生一些東西,the preprocessor symbol _MYTYPE必須正確設置(在控制檯應用程序的情況下爲"Console")。

爲了使這項工作,你還需要參考System.dll,但一切後,工作正常:

Imports System.CodeDom.Compiler 
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)). ' mscorlib 
      AddReferences(MetadataReference.CreateFromFile(GetType(GeneratedCodeAttribute).Assembly.Location)). ' System 
      AddReferences(MetadataReference.CreateFromFile(GetType(StandardModuleAttribute).Assembly.Location)). ' Microsoft.VisualBasic 
      WithOptions(New VisualBasicCompilationOptions(OutputKind.ConsoleApplication).WithParseOptions(
       VisualBasicParseOptions.Default.WithPreprocessorSymbols(New KeyValuePair(Of String, Object)("_MYTYPE", "Console")))) 

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

    End Sub 

End Module 
+0

謝謝!唯一可悲的是,你仍然不得不打擾_MYTYPE值。 –