【发布时间】:2017-04-05 09:29:54
【问题描述】:
我开发了以下代码来使用 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\我的项目\Application.Designer.vb(34): 错误 BC30284:无法将子“OnCreateMainForm”声明为“覆盖” 因为它不会覆盖基础中的子 班级。 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\我的项目\Application.Designer.vb(26) : 错误 BC30057:“公共重载子”的参数过多 新的()'。 Microsoft.CodeAnalysis.Diagnostic {Microsoft.CodeAnalysis.VisualBasic.VBDiagnostic} [4] C:\B\VBWinApp\VBWinApp\我的项目\Application.Designer.vb(27) : 错误 BC30456:“IsSingleInstance”不是 '我的应用程序'。 Microsoft.CodeAnalysis.Diagnostic {Microsoft.CodeAnalysis.VisualBasic.VBDiagnostic} [5] C:\B\VBWinApp\VBWinApp\我的项目\Application.Designer.vb(28) : 错误 BC30456:“EnableVisualStyles”不是 '我的应用程序'。 Microsoft.CodeAnalysis.Diagnostic {Microsoft.CodeAnalysis.VisualBasic.VBDiagnostic} [6] C:\B\VBWinApp\VBWinApp\我的项目\Application.Designer.vb(29) : 错误 BC30456:“SaveMySettingsOnExit”不是 '我的应用程序'。 Microsoft.CodeAnalysis.Diagnostic {Microsoft.CodeAnalysis.VisualBasic.VBDiagnostic} [7] C:\B\VBWinApp\VBWinApp\我的项目\Application.Designer.vb(30) : 错误 BC30456:“ShutDownStyle”不是 '我的应用程序'。 Microsoft.CodeAnalysis.Diagnostic {Microsoft.CodeAnalysis.VisualBasic.VBDiagnostic} [8] C:\B\VBWinApp\VBWinApp\我的项目\Application.Designer.vb(35): 错误 BC30456:“MainForm”不是 '我的应用程序'。 Microsoft.CodeAnalysis.Diagnostic {Microsoft.CodeAnalysis.VisualBasic.VBDiagnostic} [9] C:\B\VBWinApp\VBWinApp\我的项目\Application.Designer.vb(35): 错误 BC30456:“VBWinApp”不是 '全球的'。 Microsoft.CodeAnalysis.Diagnostic {Microsoft.CodeAnalysis.VisualBasic.VBDiagnostic} [10]C:\B\VBWinApp\VBWinApp\我的项目\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\我的项目\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}
【问题讨论】:
-
几乎不可能在没有看到 VB 代码的情况下帮助您,但您似乎可能缺少对某些程序集的引用。您已将
Overrides关键字与OnCreateMainForm方法一起使用,但基类显然没有该方法。由于您没有显示任何代码,这只是猜测。 -
VB项目是一个没有任何自定义的windows窗体应用程序。
-
VB.NET IDE 自动生成一堆代码来支持我的命名空间和应用程序框架功能。这就是它抱怨的代码。否则很难看到,它隐藏得很好。不完全是 DLL 项目。请考虑实施自己的 IDE 是否明智,您已经拥有了。
-
@HansPassant:我正在开发一个需要生成构建工件并上传到某个位置以进行分析的 VS 扩展。
标签: c# vb.net roslyn roslyn-code-analysis