【问题标题】:Roslyn-compiled project generates empty assemblyRoslyn 编译的项目生成空程序集
【发布时间】:2017-08-23 21:32:52
【问题描述】:

这是this question 的后续内容,我已经通过几十个帖子的组合获得了解决方案。

这可以很容易地复制:

.csproj:

<Project Sdk="Microsoft.NET.Sdk.Web">
  <PropertyGroup>
    <TargetFramework>net47</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <Folder Include="wwwroot\" />
  </ItemGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore" Version="2.0.0" />
    <PackageReference Include="Microsoft.Build" Version="15.3.409" />
    <PackageReference Include="Microsoft.Build.Tasks.Core" Version="15.3.409" />
    <PackageReference Include="Microsoft.CodeAnalysis.Analyzers" Version="2.3.0-beta1" />
    <PackageReference Include="Microsoft.CodeAnalysis.Common" Version="2.3.1" />
    <PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="2.3.1" />
    <PackageReference Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="2.3.1" />
    <PackageReference Include="Microsoft.CodeAnalysis.Workspaces.Common" Version="2.3.1" />
    <PackageReference Include="Microsoft.CodeDom.Providers.DotNetCompilerPlatform" Version="1.0.7" />
    <PackageReference Include="Microsoft.Net.Compilers" Version="2.3.1" />
  </ItemGroup>
</Project>

然后:

using System.IO;
using System.Linq;
using Microsoft.CodeAnalysis.MSBuild;

namespace WebApplication1
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var workspace = MSBuildWorkspace.Create();
            var project = workspace.OpenProjectAsyn(@"C:\WebApplication1\WebApplication1.csproj").Result;
            var compilation = project.GetCompilationAsync().Result;

            using (var memoryStream = new MemoryStream())
            {
                var result = compilation.Emit(memoryStream);
                if (result.Success)
                {
                    File.WriteAllBytes(Path.Combine(@"C:\WebApplication1\", $"{compilation.AssemblyName}.dll"), memoryStream.ToArray());
                }
            }
        }
    }
}

加载解决方案后查看工作空间,我在诊断属性上有一条错误消息:

Msbuild failed when processing the file 'C:\WebApplication1\WebApplication1.csproj' with message: The SDK 'Microsoft.NET.Sdk.Web' specified could not be found.  

【问题讨论】:

  • 对......那么我怀疑它实际上“解决”了你的问题,而不是仅仅让你继续。 :-) 您可以尝试在调试器中的solution.Projects 中四处寻找,看看是否有任何明显的问题。那只是在吐口水;我对 Roslyn API 没有个人经验。
  • 您使用的是哪个版本的 roslyn nuget 包?
  • @m0sa 如果你指的是 Microsoft.Net.Compilers NuGet 包,它是 2.3.1
  • 如果您提供minimal reproducible example 而不仅仅是在这里和那里提供sn-ps,那真的很有帮助。
  • @CamiloTerevinto:您是否对其他项目类型感兴趣与诊断方面无关。 在提出问题之前,您应该尽可能多地进行诊断工作。此外,你的例子是不完整的——你已经做了很多比需要更多的工作才能重现。 完整代码应该是可复制/粘贴/编译/运行的——一个完整的项目文件和完整的代码真的不必很大。

标签: c# .net roslyn


【解决方案1】:

根据@DustinCampbell here,这还不支持。

我通过从Process 调用dotnet build 解决了这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-11
    • 2020-10-12
    相关资源
    最近更新 更多