我正在使用Roslyn编译带有运行时生成代码的解决方案。虽然解决方案在从Visual Studio打开时完美编译,但它从Roslyn失败了:
错误CS5001:程序不包含适合的静态“主”方法 作为入口点
我正在尝试编译的解决方案有一个ASP.NET Core 2(.NET Framework 4.6.2)项目,当然在项目的根目录下的Program类中有一个Main方法:
public class Program
{
public static void Main(string[] args)
{
var host = new WebHostBuilder()
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.UseStartup<Startup>()
.Build();
host.Run();
}
}
这是我正在运行的代码,用于从.NET 4.7 WPF应用程序编译该解决方案:
private static async Task<bool> CompileSolution(string solutionPath, string outputDir)
{
var workspace = MSBuildWorkspace.Create();
var solution = await workspace.OpenSolutionAsync(solutionPath);
var projectCompilation = await solution.Projects.Single().GetCompilationAsync();
if (string.IsNullOrEmpty(projectCompilation?.AssemblyName))
{
return false;
}
using (var stream = File.Create(Path.Combine(outputDir, $"{projectCompilation.AssemblyName}.dll")))
{
var result = projectCompilation.Emit(stream);
return result.Success;
}
}
projectCompilation.Emit
失败了:
- 警告CS8021:找不到RuntimeMetadataVersion的值。没有找到包含System.Object的程序集,也没有值 通过选项指定的RuntimeMetadataVersion。
- 错误CS5001:程序不包含适合的静态“Main”方法 作为入境点
是否正在使用的NuGet包不能正确支持.NET Core 2项目?我没有任何待处理(甚至没有预览)的软件包更新。
我现在已将ASP.NET Core项目更新为.NET 4.7,因此两个解决方案的版本相同,但未更改生成的错误。 csproj看起来像这样:
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net47</TargetFramework>
<MvcRazorCompileOnPublish>true</MvcRazorCompileOnPublish>
<TargetFrameworkVersion>v4.7</TargetFrameworkVersion>
<ApplicationIcon />
<OutputType>Exe</OutputType>
<StartupObject>Practia.CrudGenerator.Web.Program</StartupObject>
</PropertyGroup>
<ItemGroup>..NUGET PACKAGES...</ItemGroup>
</Project>
答案 0 :(得分:5)
通过在尝试发出结果之前添加这两行来解决问题:
compilation = compilation.AddReferences(MetadataReference.CreateFromFile(typeof(object).Assembly.Location));
compilation = compilation.WithOptions(new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary));
请注意,AddReferences
和WithOptions
都会返回新的Compilation
个实例,因此需要重新分配。