使用 Microsoft.CodeAnalysis.Emit 的 Visual Basic 项目中的编译器问题 [英] Compiler Issue in Visual Basic Project With Microsoft.CodeAnalysis.Emit

查看:53
本文介绍了使用 Microsoft.CodeAnalysis.Emit 的 Visual Basic 项目中的编译器问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我开发了以下代码来使用 Microsoft.CodeAnalysis.Emit 库生成 dll 文件.该代码成功地为 C# 项目生成了 dll 文件.但是,它没有成功构建 Visual Basic 项目.对于使用 VS IDE 成功构建的 VB 项目,它会引发大量编译器错误.请参阅为基本 Windows 应用程序项目抛出的错误.VB 项目是否有任何特定的编译器选项?请建议如何解决此问题.

I have developed following code to generate dll files using Microsoft.CodeAnalysis.Emit library. The code successfully generates dll files for C# projects. However it doesn't successfully build Visual Basic projects. It throws lot of compiler errors for VB projects which build successfully using the VS IDE. Please see the errors thrown for a basic Windows application project. Is there any specific compiler options for VB projects? Please advice how to resolve this.

Microsoft.CodeAnalysis 包版本:1.3.1

Microsoft.CodeAnalysis package version: 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\My Project\Application.Designer.vb(34) :错误 BC30284:无法将子OnCreateMainForm"声明为覆盖"因为它不会覆盖 base 中的 sub班级.Microsoft.CodeAnalysis.Diagnostic{Microsoft.CodeAnalysis.VisualBasic.VBDiagnostic}[1] C:\B\VBWinApp\VBWinApp\My Project\Settings.Designer.vb(67):错误BC30002:类型Global.VBWinApp.My.MySettings"不是定义.Microsoft.CodeAnalysis.Diagnostic{Microsoft.CodeAnalysis.VisualBasic.VBDiagnostic}[2] C:\B\VBWinApp\VBWinApp\My Project\Settings.Designer.vb(69):错误BC30456:VBWinApp"不是'全球的'.Microsoft.CodeAnalysis.Diagnostic{Microsoft.CodeAnalysis.VisualBasic.VBDiagnostic}[3] C:\B\VBWinApp\VBWinApp\My Project\Application.Designer.vb(26) :错误 BC30057:公共重载子"的参数太多新的()'.Microsoft.CodeAnalysis.Diagnostic{Microsoft.CodeAnalysis.VisualBasic.VBDiagnostic}[4] C:\B\VBWinApp\VBWinApp\My Project\Application.Designer.vb(27) :错误 BC30456:IsSingleInstance"不是'我的应用程序'.Microsoft.CodeAnalysis.Diagnostic{Microsoft.CodeAnalysis.VisualBasic.VBDiagnostic}[5] C:\B\VBWinApp\VBWinApp\My Project\Application.Designer.vb(28) :错误 BC30456:EnableVisualStyles"不是'我的应用程序'.Microsoft.CodeAnalysis.Diagnostic{Microsoft.CodeAnalysis.VisualBasic.VBDiagnostic}[6] C:\B\VBWinApp\VBWinApp\My Project\Application.Designer.vb(29) :错误 BC30456:SaveMySettingsOnExit"不是'我的应用程序'.Microsoft.CodeAnalysis.Diagnostic{Microsoft.CodeAnalysis.VisualBasic.VBDiagnostic}[7] C:\B\VBWinApp\VBWinApp\My Project\Application.Designer.vb(30) :错误 BC30456:ShutDownStyle"不是'我的应用程序'.Microsoft.CodeAnalysis.Diagnostic{Microsoft.CodeAnalysis.VisualBasic.VBDiagnostic}[8] C:\B\VBWinApp\VBWinApp\My Project\Application.Designer.vb(35) :错误 BC30456:MainForm"不是'我的应用程序'.Microsoft.CodeAnalysis.Diagnostic{Microsoft.CodeAnalysis.VisualBasic.VBDiagnostic}[9] C:\B\VBWinApp\VBWinApp\My Project\Application.Designer.vb(35) :错误 BC30456:VBWinApp"不是'全球的'.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):错误BC30456:应用程序"不是'我的'.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):隐藏 BC50001:未使用的导入陈述.Microsoft.CodeAnalysis.Diagnostic{Microsoft.CodeAnalysis.VisualBasic.VBDiagnostic}[14]C:\Users\xxxxx\AppData\Local\Temp.NETFramework,Version=v4.5.2.AssemblyAttributes.vb(5):隐藏 BC50001:未使用的导入陈述.Microsoft.CodeAnalysis.Diagnostic{Microsoft.CodeAnalysis.VisualBasic.VBDiagnostic}

[0] C:\B\VBWinApp\VBWinApp\My Project\Application.Designer.vb(34) : error BC30284: sub 'OnCreateMainForm' cannot be declared 'Overrides' because it does not override a sub in a base class. 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' is not defined. Microsoft.CodeAnalysis.Diagnostic {Microsoft.CodeAnalysis.VisualBasic.VBDiagnostic} [2] C:\B\VBWinApp\VBWinApp\My Project\Settings.Designer.vb(69) : error BC30456: 'VBWinApp' is not a member of 'Global'. Microsoft.CodeAnalysis.Diagnostic {Microsoft.CodeAnalysis.VisualBasic.VBDiagnostic} [3] C:\B\VBWinApp\VBWinApp\My Project\Application.Designer.vb(26) : error BC30057: Too many arguments to 'Public Overloads Sub New()'. Microsoft.CodeAnalysis.Diagnostic {Microsoft.CodeAnalysis.VisualBasic.VBDiagnostic} [4] C:\B\VBWinApp\VBWinApp\My Project\Application.Designer.vb(27) : error BC30456: 'IsSingleInstance' is not a member of 'MyApplication'. Microsoft.CodeAnalysis.Diagnostic {Microsoft.CodeAnalysis.VisualBasic.VBDiagnostic} [5] C:\B\VBWinApp\VBWinApp\My Project\Application.Designer.vb(28) : error BC30456: 'EnableVisualStyles' is not a member of 'MyApplication'. Microsoft.CodeAnalysis.Diagnostic {Microsoft.CodeAnalysis.VisualBasic.VBDiagnostic} [6] C:\B\VBWinApp\VBWinApp\My Project\Application.Designer.vb(29) : error BC30456: 'SaveMySettingsOnExit' is not a member of 'MyApplication'. Microsoft.CodeAnalysis.Diagnostic {Microsoft.CodeAnalysis.VisualBasic.VBDiagnostic} [7] C:\B\VBWinApp\VBWinApp\My Project\Application.Designer.vb(30) : error BC30456: 'ShutDownStyle' is not a member of 'MyApplication'. Microsoft.CodeAnalysis.Diagnostic {Microsoft.CodeAnalysis.VisualBasic.VBDiagnostic} [8] C:\B\VBWinApp\VBWinApp\My Project\Application.Designer.vb(35) : error BC30456: 'MainForm' is not a member of 'MyApplication'. Microsoft.CodeAnalysis.Diagnostic {Microsoft.CodeAnalysis.VisualBasic.VBDiagnostic} [9] C:\B\VBWinApp\VBWinApp\My Project\Application.Designer.vb(35) : error BC30456: 'VBWinApp' is not a member of 'Global'. Microsoft.CodeAnalysis.Diagnostic {Microsoft.CodeAnalysis.VisualBasic.VBDiagnostic} [10]C:\B\VBWinApp\VBWinApp\My Project\Settings.Designer.vb(33) : error BC30456: 'Application' is not a member of 'My'. Microsoft.CodeAnalysis.Diagnostic {Microsoft.CodeAnalysis.VisualBasic.VBDiagnostic} [11]C:\B\VBWinApp\VBWinApp\My Project\Settings.Designer.vb(47) : error BC30456: 'Application' is not a member of 'My'. Microsoft.CodeAnalysis.Diagnostic {Microsoft.CodeAnalysis.VisualBasic.VBDiagnostic} [12]C:\B\VBWinApp\VBWinApp\My Project\AssemblyInfo.vb(1) : hidden BC50001: Unused import statement. Microsoft.CodeAnalysis.Diagnostic {Microsoft.CodeAnalysis.VisualBasic.VBDiagnostic} [13]C:\Users\xxxxx\AppData\Local\Temp.NETFramework,Version=v4.5.2.AssemblyAttributes.vb(4) : hidden BC50001: Unused import statement. Microsoft.CodeAnalysis.Diagnostic {Microsoft.CodeAnalysis.VisualBasic.VBDiagnostic} [14]C:\Users\xxxxx\AppData\Local\Temp.NETFramework,Version=v4.5.2.AssemblyAttributes.vb(5) : hidden BC50001: Unused import statement. Microsoft.CodeAnalysis.Diagnostic {Microsoft.CodeAnalysis.VisualBasic.VBDiagnostic}

推荐答案

问题在于,通过设置编译选项,您将丢弃来自项目的所有选项.如果你只是注释掉 compilation = compiler.WithOptions(options); 行,编译应该会成功(至少它对我新创建的 VB.NET WinForms 项目是成功的).

The issue is that by setting compilation options, you're throwing away all options that come from the project. If you just comment out the line compilation = compilation.WithOptions(options);, compilation should succeed (at least it does for me for a newly created VB.NET WinForms project).

这篇关于使用 Microsoft.CodeAnalysis.Emit 的 Visual Basic 项目中的编译器问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆