Microsoft.CodeAnalysis.Emit 的 Visual Basic 项目中的编译器问题
Compiler Issue in Visual Basic Project With Microsoft.CodeAnalysis.Emit
我开发了以下代码来使用 Microsoft.CodeAnalysis.Emit 库生成 dll 文件。该代码成功为 C# 项目生成了 dll 文件。但是它不能成功地构建 Visual Basic 项目。对于使用 VS IDE 成功构建的 VB 项目,它会引发大量编译器错误。请查看基本 Windows 应用程序项目抛出的错误。 VB 项目是否有任何特定的编译器选项?请指教如何解决这个问题。
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\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 = compilation.WithOptions(options);
行,编译应该会成功(至少对于我新建的 VB.NET WinForms 项目来说是这样)。
我开发了以下代码来使用 Microsoft.CodeAnalysis.Emit 库生成 dll 文件。该代码成功为 C# 项目生成了 dll 文件。但是它不能成功地构建 Visual Basic 项目。对于使用 VS IDE 成功构建的 VB 项目,它会引发大量编译器错误。请查看基本 Windows 应用程序项目抛出的错误。 VB 项目是否有任何特定的编译器选项?请指教如何解决这个问题。
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\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 = compilation.WithOptions(options);
行,编译应该会成功(至少对于我新建的 VB.NET WinForms 项目来说是这样)。