2017-04-05 134 views
-2

我开发了以下代码以使用Microsoft.CodeAnalysis.Emit库生成dll文件。该代码成功生成C#项目的dll文件。但是,它不能成功构建Visual Basic项目。它会为使用VS IDE成功构建的VB项目引发大量编译器错误。请参阅基本Windows应用程序项目引发的错误。 VB项目有没有特定的编译器选项?请咨询如何解决这个问题。使用Microsoft.CodeAnalysis.Emit的Visual Basic项目中的编译器问题

Microsoft.CodeAnalysis包版本:1.3.1

class Program 
{ 
    static void Main(string[] args) 
    { 
     const string UnitTestArtifactFolder = @"c:\VSUnitTest"; 
     string SolutionPath = @"C:\B\VBWinApp\VBWinApp\VBWinApp.vbproj"; 
     CompileProject(SolutionPath, UnitTestArtifactFolder); 
    } 

    private static void CompileProject(string projectFilePath, string outputFolderPath) 
    { 
     using (var workspace = MSBuildWorkspace.Create()) 
     { 
      var project = workspace.OpenProjectAsync(projectFilePath).Result; 
      Emit(project, outputFolderPath).Wait(); 
     } 
    } 

    private static async Task Emit(Project project, string outputFolderPath) 
    { 
     Directory.CreateDirectory(outputFolderPath); 
     var options = GetCompilationOptions(project); 
     var compilation = await project.GetCompilationAsync(); 
     compilation = compilation.WithOptions(options); 
     var outputFilePath = Path.Combine(outputFolderPath, Path.GetFileName(project.OutputFilePath)); 
     var pdbFilePath = Path.ChangeExtension(outputFilePath, "pdb"); 
     //LogInfo("Compiling the project..."); 
     var compilationStatus = compilation.Emit(outputFilePath, pdbPath: pdbFilePath); 

     if (!compilationStatus.Success) 
     { 
      //LogError(compilationStatus.Diagnostics.First(k => k.WarningLevel == 0)); 
     } 
     else 
     { 
      // LogInfo("Compilation successful."); 
     } 
    } 

    private static CompilationOptions GetCompilationOptions(Project project) 
    { 
     if (project.Language == "C#") 
     { 
      //LogInfo("Using C# Compilation Options"); 
      return new CSharpCompilationOptions 
      (OutputKind.DynamicallyLinkedLibrary, optimizationLevel: OptimizationLevel.Debug); 
     } 
     else if (project.Language == "Visual Basic") 
     { 
      //LogInfo("Using Visual Basic Compilation Options"); 
      return new VisualBasicCompilationOptions 
       (OutputKind.DynamicallyLinkedLibrary, optimizationLevel: OptimizationLevel.Debug); 
     } 
     else 
     { 
      //Throw if the language is other than C# or VB 
      throw new InvalidOperationException("Unsupported Language."); 
     } 
    } 
} 

上基本的Windows应用程序编译器错误。

[0] C:\ B \ VBWinApp \ VBWinApp \我的项目\ Application.Designer.vb(34): 错误BC30284:子 'OnCreateMainForm' 不能声明为 '覆盖' 因为它不覆盖基类 类中的一个子类。 Microsoft.CodeAnalysis.Diagnostic {Microsoft.CodeAnalysis.VisualBasic.VBDiagnostic} [1] C:\ B \ VBWinApp \ VBWinApp \ My Project \ Settings.Designer.vb(67):error BC30002:Type'Global.VBWinApp。 My.MySettings'不是 定义的。 Microsoft.CodeAnalysis.Diagnostic {Microsoft.CodeAnalysis.VisualBasic.VBDiagnostic} [2] C:\ B \ VBWinApp \ VBWinApp \ My Project \ Settings.Designer.vb(69):error BC30456:'VBWinApp'is not a 'Global'的成员。 Microsoft.CodeAnalysis.Diagnostic {Microsoft.CodeAnalysis.VisualBasic.VBDiagnostic} [3] C:\ B \ VBWinApp \ VBWinApp \ My Project \ Application.Designer.vb(26): 错误BC30057:太多的公共参数过载Sub New()'。 Microsoft.CodeAnalysis.Diagnostic {Microsoft.CodeAnalysis.VisualBasic.VBDiagnostic} [4] C:\ B \ VBWinApp \ VBWinApp \ My Project \ Application.Designer.vb(27): 错误BC30456:'IsSingleInstance'不是 'MyApplication'的成员。 Microsoft.CodeAnalysis.Diagnostic {Microsoft.CodeAnalysis.VisualBasic.VBDiagnostic} [5] C:\ B \ VBWinApp \ VBWinApp \ My Project \ Application.Designer.vb(28): 错误BC30456:'EnableVisualStyles'is not a 'MyApplication'的成员。 Microsoft.CodeAnalysis.Diagnostic {Microsoft.CodeAnalysis.VisualBasic.VBDiagnostic} [6] C:\ B \ VBWinApp \ VBWinApp \ My Project \ Application.Designer.vb(29): 错误BC30456:'SaveMySettingsOnExit'不是 'MyApplication'的成员。 Microsoft.CodeAnalysis.Diagnostic {Microsoft.CodeAnalysis.VisualBasic.VBDiagnostic} [7] C:\ B \ VBWinApp \ VBWinApp \ My Project \ Application.Designer.vb(30): 错误BC30456:'ShutDownStyle'不是 'MyApplication'的成员。 Microsoft.CodeAnalysis.Diagnostic {Microsoft.CodeAnalysis.VisualBasic.VBDiagnostic} [8] C:\ B \ VBWinApp \ VBWinApp \ My Project \ Application.Designer.vb(35): 错误BC30456:'MainForm'不是 'MyApplication'的成员。 Microsoft.CodeAnalysis.Diagnostic 错误BC30456:VBWinApp不是一个 'Global'的成员。 Microsoft.CodeAnalysis.Diagnostic {Microsoft.CodeAnalysis.VisualBasic.VBDiagnostic} [10] C:\ B \ VBWinApp \ VBWinApp \ My Project \ Settings.Designer。vb(33):错误 BC30456:'应用程序'不是 '我的'的成员。 Microsoft.CodeAnalysis.Diagnostic {Microsoft.CodeAnalysis.VisualBasic.VBDiagnostic} [11] C:\ B \ VBWinApp \ VBWinApp \ My Project \ Settings.Designer.vb(47):error BC30456:'Application'is not a我的' 成员。 Microsoft.CodeAnalysis.Diagnostic {Microsoft.CodeAnalysis.VisualBasic.VBDiagnostic} [12] C:\ B \ VBWinApp \ VBWinApp \ My Project \ AssemblyInfo.vb(1):隐藏 BC50001:未使用的导入语句。 Microsoft.CodeAnalysis.Diagnostic {Microsoft.CodeAnalysis.VisualBasic.VBDiagnostic} [13] C:\ Users \ xxxxx \ AppData \ Local \ Temp.NETFramework,Version = v4.5.2.AssemblyAttributes.vb(4) :hidden BC50001 :未使用的进口 声明。 Microsoft.CodeAnalysis.Diagnostic {Microsoft.CodeAnalysis.VisualBasic.VBDiagnostic} [14] C:\ Users \ xxxxx \ AppData \ Local \ Temp.NETFramework,Version = v4.5.2.AssemblyAttributes.vb(5) :hidden BC50001 :未使用的进口 声明。 Microsoft.CodeAnalysis.Diagnostic {} Microsoft.CodeAnalysis.VisualBasic.VBDiagnostic

+0

几乎不可能在没有看到VB代码的情况下帮助你,但看起来你可能缺少对某些程序集的引用。你已经使用'Overrides'关键字和'OnCreateMainForm'方法,但是基类显然没有这个方法。因为你没有显示任何只是猜测的代码。 –

+0

VB项目是一个没有任何定制的Windows窗体应用程序。 – Bandara

+0

VB.NET IDE自动生成一堆代码以支持My命名空间和应用程序框架功能。这是它所抱怨的代码。否则很难看,它很好隐藏。不完全是一个DLL项目。考虑实现你自己的IDE的可疑智慧,你已经有了。 –

回答

4

的问题是,通过设置编译选项,你把自己的那个来自该项目的所有选项。如果你只是注释掉compilation = compilation.WithOptions(options);这行,编译应该会成功(至少对于我新创建的VB.NET WinForms项目来说)。

+0

谢谢svick,看来我已经重写了项目的默认编译选项。我已经按照您的建议评论了代码,并且工作正常。 – Bandara