通过Roslyn编译时找不到“主要”方法

时间:2017-08-22 15:35:12

标签: c# .net roslyn

我正在使用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>

1 个答案:

答案 0 :(得分:5)

通过在尝试发出结果之前添加这两行来解决问题:

compilation = compilation.AddReferences(MetadataReference.CreateFromFile(typeof(object).Assembly.Location));
compilation = compilation.WithOptions(new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary));

请注意,AddReferencesWithOptions都会返回新的Compilation个实例,因此需要重新分配。