C# 与Roslyn一起编译

C# 与Roslyn一起编译,c#,compiler-construction,roslyn,C#,Compiler Construction,Roslyn,我正在尝试编译解决方案,但在尝试保存时收到一条模糊的错误消息 匿名类型\uuuu blahblah未完成 然而,在编译的源代码中没有任何匿名类型 代码是 private static void Compile(ISolution solution) { var workspaceServices = (IHaveWorkspaceServices)solution; var projectDependencyService = workspaceServi

我正在尝试编译解决方案,但在尝试保存时收到一条模糊的错误消息

匿名类型\uuuu blahblah未完成

然而,在编译的源代码中没有任何匿名类型

代码是

private static void Compile(ISolution solution)
    {
        var workspaceServices = (IHaveWorkspaceServices)solution;
        var projectDependencyService = workspaceServices.WorkspaceServices.GetService<IProjectDependencyService>();

        foreach (var projectId in projectDependencyService.GetDependencyGraph(solution).GetTopologicallySortedProjects())
        {
            var currentDomain = AppDomain.CurrentDomain;
            var assemblyName = new AssemblyName();
            assemblyName.Name = "Most." + solution.GetProject(projectId).AssemblyName;

            var assemblyBuilder = currentDomain.DefineDynamicAssembly
                           (assemblyName, AssemblyBuilderAccess.RunAndSave);

            var moduleBuilder = assemblyBuilder.
                                            DefineDynamicModule(assemblyName.Name);
            var types = moduleBuilder.GetTypes();
            types.Aggregate((ts, t) =>
            {
                var tb = t as TypeBuilder;
                return tb.CreateType();
            });
            solution.GetProject(projectId).GetCompilation().Emit(moduleBuilder);
            assemblyBuilder.Save(assemblyName.Name);
        }
    }
私有静态无效编译(隔离解决方案)
{
var workspaceServices=(IHaveWorkspaceServices)解决方案;
var projectDependencyService=workspaceServices.workspaceServices.GetService();
foreach(projectDependencyService.GetDependencyGraph(解决方案).GetTopologicalySortedProjects()中的变量projectId)
{
var currentDomain=AppDomain.currentDomain;
var assemblyName=新的assemblyName();
assemblyName.Name=“Most.”+solution.GetProject(projectId).assemblyName;
var assemblyBuilder=currentDomain.DefinedDynamicAssembly
(assemblyName,AssemblyBuilderAccess.RunAndSave);
var moduleBuilder=assemblyBuilder。
DefinedDynamicModule(assemblyName.Name);
var types=moduleBuilder.GetTypes();
类型.聚合((ts,t)=>
{
var tb=t作为类型生成器;
返回tb.CreateType();
});
solution.GetProject(projectd.GetCompilation().Emit(moduleBuilder);
assemblyBuilder.Save(assemblyName.Name);
}
}

这是Roslyn的一个bug。全文转载于:

var assemblyName = new AssemblyName { Name = "Test" };

var compilation = Compilation.Create(
    assemblyName.Name, new CompilationOptions(OutputKind.DynamicallyLinkedLibrary),
    new[] {
        SyntaxTree.ParseText(@"
using System;
using System.Linq;    

public class C1
{
    public void M1() 
    {
        new[] {1}.Select(_ => new {});
    }
}")
    },
    new[] {
        MetadataReference.CreateAssemblyReference("mscorlib"),
        MetadataReference.CreateAssemblyReference("System.Core")
    });

var assembly = AppDomain.CurrentDomain.DefineDynamicAssembly(
    assemblyName, AssemblyBuilderAccess.RunAndSave);
var moduleBuilder = assembly.DefineDynamicModule(assemblyName.Name, assemblyName.Name + ".dll");

var emitResult = compilation.Emit(moduleBuilder);

if (emitResult.Success)
{
    assembly.Save(assemblyName.Name + ".dll"); //Error! Type '<>f__AnonymousType0' was not completed.
}
else
{
    throw new NotImplementedException();
}
var assemblyName=newassemblyname{Name=“Test”};
var compilation=compilation.Create(
assemblyName.Name,新编译选项(OutputKind.DynamicallyLinkedLibrary),
新[]{
SyntaxTree.ParseText(@)
使用制度;
使用System.Linq;
公共类别C1
{
公共空间M1()
{
新建[]{1}。选择(=>new{});
}
}")
},
新[]{
MetadataReference.CreateSassemblyReference(“mscorlib”),
MetadataReference.CreateSassemblyReference(“System.Core”)
});
var assembly=AppDomain.CurrentDomain.DefinedDynamicAssembly(
assemblyName,AssemblyBuilderAccess.RunAndSave);
var moduleBuilder=assembly.definedDynamicModule(assemblyName.Name,assemblyName.Name+“.dll”);
var emitResult=compilation.Emit(moduleBuilder);
if(emitResult.Success)
{
assembly.Save(assemblyName.Name+“.dll”);//错误!未完成键入“f_uAnonymousType0”。
}
其他的
{
抛出新的NotImplementedException();
}

在您的代码中是否有真正被称为
blahblah
的东西?还是更改了编译器消息中的实际类型名称?如果在Roslyn的某个地方有剩余的测试代码打印“blahblah”,那将是非常有趣的。@MagnusGrindalBakken是的,那会很有趣,但我确实改变了它。更像是“AnononymousType5'2”这听起来像是Roslyn的臭虫,你可能应该报告它。@svick如果不是因为Roslyn项目页面上的提交错误在一个页面上结束,让我知道我要找的页面没有exist@RuneFS转到并单击Microsoft Roslyn CTP下的按钮。在您的代码中有一个匿名类型,因此可能是另一个错误