2017-08-22 27 views
3

我正在使用Roslyn編譯帶有運行時生成代碼的解決方案。雖然該解決方案從Visual Studio打開時完全編譯,從羅斯林失敗:在通過Roslyn編譯時未找到'Main'方法

錯誤CS5001:程序不包含一個靜態的「主」方法適合 爲切入點

的解決方案,我我嘗試編譯具有一個ASP.NET的Core 2(.NET框架4.6.2)項目,這當然在項目的根在該計劃一類主要方法:

public class Program 
{ 
    public static void Main(string[] args) 
    { 
     var host = new WebHostBuilder() 
      .UseKestrel() 
      .UseContentRoot(Directory.GetCurrentDirectory()) 
      .UseIISIntegration() 
      .UseStartup<Startup>() 
      .Build(); 

     host.Run(); 
    } 
} 

這是我正在運行com的代碼一堆的解決方案,從.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:程序不包含適合的切入點

難道說的NuGet包正在使用不正確支持.NET的核心又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

請添加包含您的'Main'方法的類定義。 –

+0

@ErikPhilips已更新。這是標準VS生成的項目 –

+1

你有沒有[看看這個?](https://stackoverflow.com/questions/577298/program-does-not-contain-a-static-main-method-suitable-for- an-entry-point) –

回答

1

問題是由試圖發射結果之前添加以下兩行解決:

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

注意兩個AddReferencesWithOptions返回新Compilation情況,所以它是需要重新分配。