2013-08-15 1 views
2

솔루션을 컴파일하려고하는데 저장하려고하면 애매한 오류 메시지가 나타납니다.Roslyn으로 컴파일

익명 유형은 <> __ 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); 
     } 
    } 
+0

실제로 코드에 'blahblah'라는 것이 있습니까? 또는 컴파일러 메시지에서 실제 유형 이름을 변경 했습니까? Roslyn의 어딘가에서 'blahblah'를 출력하는 테스트 코드가 남아 있다면 꽤 재미있을 것입니다. –

+0

@MagnusGrindalBakken 예 재미 있었을 지 모르지만 나는 그것을 바 꾸었습니다. 그것은 더 많이 같았습니다. <> _ AnnonymousType5'2' –

+0

Roslyn의 버그처럼 들리 겠지만 아마도 그것을보고해야합니다. – svick

답변

1

입니다.

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(); 
} 
+0

코드에는 익명 형식이 있으므로 다른 오류가있을 수 있습니다. –