significado lyrics iver bon c# roslyn

c# - lyrics - Roslyn no tiene ninguna referencia a System.Runtime



roslyn lyrics (2)

Estoy trabajando en un proyecto en el que estamos utilizando Roslyn para compilar algunas plantillas para nosotros. Ahora, cuando estoy compilando la plantilla, estoy recibiendo varios errores en CompileResult.Diagnostics .

Los errores son:

(21,6): error CS0012: The type ''System.Attribute'' is defined in an assembly that is not referenced. You must add a reference to assembly ''System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a''. (21,6): error CS0012: The type ''System.Type'' is defined in an assembly that is not referenced. You must add a reference to assembly ''System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a''.

Al ver estos errores, asumí que no había agregado una referencia al ensamblado System.Runtime correctamente. Sin embargo, después de verificar los ensamblajes cargados, esto parece estar en orden.

private IEnumerable<MetadataReference> GetGlobalReferences() { var assemblies = new [] { typeof(System.Object).Assembly, //mscorlib typeof(System.Composition.ExportAttribute).Assembly, //System.Composition (MEF) typeof(System.CodeDom.Compiler.CodeCompiler).Assembly, //System.CodeDom.Compiler }; var refs = from a in assemblies select new MetadataFileReference(a.Location); return refs.ToList(); }

Y la propia compilación:

public void Compile(AssemblyFileInfo assemblyInfo) { Parse(assemblyInfo.Files); var compilation = CSharpCompilation.Create(assemblyInfo.FilePath, options: new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary)) .AddReferences(GetGlobalReferences()) .AddSyntaxTrees(assemblyInfo.SourceCodeSyntaxTrees); assemblyInfo.CompileResult = compilation.Emit(assemblyInfo.FilePath); }

¿Me estoy perdiendo algo obvio? Parece que todos los requisitos previos para una compilación exitosa están satisfechos, pero aparentemente no lo están.

Para referencia, este es el trozo de código (confuso) que estoy tratando de compilar:

namespace Project.Rules.Generated { using System; using System.Runtime; using System.Composition; using System.CodeDom.Compiler; [Export(typeof(IProject))] [GeneratedCode("Project Template Compiler", "1.0")] public sealed class ProcessPriorityValue : ProjectConcreteClass { public override void Execute(ProjectExecutionContext ctx) { CurrentContext = ctx; } } }

He avanzado un poco en mis búsquedas. La PublicKeyToken especificada en los mensajes de error coincide con la PublicKeyToken de los ensamblados System.Composition. Mi conjetura fue que agregar todos los ensamblajes posiblemente podría solucionar el problema. Esto es correcto, o al menos parte de la solución. Al usar dotPeek pude verificar qué objetos existen en los diferentes ensamblajes. Con este conocimiento, he cambiado el método GetGlobalReferences() a esto:

private IEnumerable<MetadataReference> GetGlobalReferences() { var assemblies = new [] { typeof(System.Object).Assembly, //mscorlib typeof(System.Composition.ExportAttribute).Assembly, //System.Composition.AttributeModel typeof(System.Composition.Convention.ConventionBuilder).Assembly, //System.Composition.Convention typeof(System.Composition.Hosting.CompositionHost).Assembly, //System.Composition.Hosting typeof(System.Composition.CompositionContext).Assembly, //System.Composition.Runtime typeof(System.Composition.CompositionContextExtensions).Assembly, //System.Composition.TypedParts typeof(System.CodeDom.Compiler.CodeCompiler).Assembly, //System.CodeDom.Compiler }; var refs = from a in assemblies select new MetadataFileReference(a.Location); return refs.ToList(); }

Como puede ver, ahora estoy agregando todos los ensamblados System.Composition especificando un objeto que existe en el ensamblaje. Al agregar System.Composition.Runtime , mis errores de compilación se resolvieron.

Sin embargo, esto introdujo un error diferente. Como puede verlo usted mismo, hay una clase de Exportación genérica en System.Composition.Runtime : public sealed class Export<T> : IDisposable Debido a esto, ahora estoy recibiendo este error:

(21,6): error CS0404: Cannot apply attribute class ''System.Composition.Export<T>'' because it is generic

Por alguna razón, el código ahora quiere usar System.Composition.Runtime.Export<T> y no el atributo ExportAttribute, definido en el ensamblado System.Composition.AttributeModel .

edit2

Puedo confirmar que el código anterior utiliza System.Composition.Export<T> y no el ExportAttribute . Descubrí esto cambiando [Export(typeof(IProject)] a [ExportAttribute(typeof(IProject)] . Debido a este cambio, los errores originales se devolvieron. Parece que el ensamblaje System.Composition.AttributeModel no está cargado / referenciado correctamente, pero después de comprobar la compilation , puedo ver que se hace referencia al conjunto ok.

Las asambleas de referencia que tengo en este momento son:

+ [0] mscorlib, Version=4.0.0.0, Culture=neutral, PublicKey=00000000000000000400000000000000 Microsoft.CodeAnalysis.AssemblyIdentity + [1] System.Composition.AttributedModel, Version=1.0.20.0, Culture=neutral, PublicKey=002400000480000094000000060200000024000052534131000400000100010007d1fa57c4aed9f0a32e84aa0faefd0de9e8fd6aec8f87fb03766c834c99921eb23be79ad9d5dcc1dd9ad236132102900b723cf980957fc4e177108fc607774f29e8320e92ea05ece4e821c0a5efe8f1645c4c0c93c1ab99285d622caa652c1dfad63d745d6f2de5f17e5eaf0fc4963d261c8a12436518206dc093344d5ad293 Microsoft.CodeAnalysis.AssemblyIdentity + [2] System.Composition.Convention, Version=1.0.20.0, Culture=neutral, PublicKey=002400000480000094000000060200000024000052534131000400000100010007d1fa57c4aed9f0a32e84aa0faefd0de9e8fd6aec8f87fb03766c834c99921eb23be79ad9d5dcc1dd9ad236132102900b723cf980957fc4e177108fc607774f29e8320e92ea05ece4e821c0a5efe8f1645c4c0c93c1ab99285d622caa652c1dfad63d745d6f2de5f17e5eaf0fc4963d261c8a12436518206dc093344d5ad293 Microsoft.CodeAnalysis.AssemblyIdentity + [3] System.Composition.Hosting, Version=1.0.20.0, Culture=neutral, PublicKey=002400000480000094000000060200000024000052534131000400000100010007d1fa57c4aed9f0a32e84aa0faefd0de9e8fd6aec8f87fb03766c834c99921eb23be79ad9d5dcc1dd9ad236132102900b723cf980957fc4e177108fc607774f29e8320e92ea05ece4e821c0a5efe8f1645c4c0c93c1ab99285d622caa652c1dfad63d745d6f2de5f17e5eaf0fc4963d261c8a12436518206dc093344d5ad293 Microsoft.CodeAnalysis.AssemblyIdentity + [4] System.Composition.Runtime, Version=1.0.20.0, Culture=neutral, PublicKey=002400000480000094000000060200000024000052534131000400000100010007d1fa57c4aed9f0a32e84aa0faefd0de9e8fd6aec8f87fb03766c834c99921eb23be79ad9d5dcc1dd9ad236132102900b723cf980957fc4e177108fc607774f29e8320e92ea05ece4e821c0a5efe8f1645c4c0c93c1ab99285d622caa652c1dfad63d745d6f2de5f17e5eaf0fc4963d261c8a12436518206dc093344d5ad293 Microsoft.CodeAnalysis.AssemblyIdentity + [5] System.Composition.TypedParts, Version=1.0.20.0, Culture=neutral, PublicKey=002400000480000094000000060200000024000052534131000400000100010007d1fa57c4aed9f0a32e84aa0faefd0de9e8fd6aec8f87fb03766c834c99921eb23be79ad9d5dcc1dd9ad236132102900b723cf980957fc4e177108fc607774f29e8320e92ea05ece4e821c0a5efe8f1645c4c0c93c1ab99285d622caa652c1dfad63d745d6f2de5f17e5eaf0fc4963d261c8a12436518206dc093344d5ad293 Microsoft.CodeAnalysis.AssemblyIdentity + [6] Microsoft.CSharp, Version=4.0.0.0, Culture=neutral, PublicKey=002400000480000094000000060200000024000052534131000400000100010007d1fa57c4aed9f0a32e84aa0faefd0de9e8fd6aec8f87fb03766c834c99921eb23be79ad9d5dcc1dd9ad236132102900b723cf980957fc4e177108fc607774f29e8320e92ea05ece4e821c0a5efe8f1645c4c0c93c1ab99285d622caa652c1dfad63d745d6f2de5f17e5eaf0fc4963d261c8a12436518206dc093344d5ad293 Microsoft.CodeAnalysis.AssemblyIdentity + [7] System, Version=4.0.0.0, Culture=neutral, PublicKey=00000000000000000400000000000000 Microsoft.CodeAnalysis.AssemblyIdentity + [8] System.Core, Version=4.0.0.0, Culture=neutral, PublicKey=00000000000000000400000000000000 Microsoft.CodeAnalysis.AssemblyIdentity + [9] System.Data, Version=4.0.0.0, Culture=neutral, PublicKey=00000000000000000400000000000000 Microsoft.CodeAnalysis.AssemblyIdentity


A pedido de Dejan en la sección de comentarios, publicaré la respuesta (a mi problema) como una respuesta real.

¡He descubierto cuál era el problema! El compilador fue correcto todo el tiempo. Una publicación en el blog de smack0007 me smack0007 a intentar otra cosa. En lugar de usar la dll Facade, intente hacer referencia a las dll necesarias manualmente. El método GetGlobalReferences ahora se ve así:

private IEnumerable<MetadataReference> GetGlobalReferences() { var assemblies = new [] { /*Making sure all MEF assemblies are loaded*/ typeof(System.Composition.Convention.AttributedModelProvider).Assembly, //System.Composition.AttributeModel typeof(System.Composition.Convention.ConventionBuilder).Assembly, //System.Composition.Convention typeof(System.Composition.Hosting.CompositionHost).Assembly, //System.Composition.Hosting typeof(System.Composition.CompositionContext).Assembly, //System.Composition.Runtime typeof(System.Composition.CompositionContextExtensions).Assembly, //System.Composition.TypedParts /*Used for the GeneratedCode attribute*/ typeof(System.CodeDom.Compiler.CodeCompiler).Assembly, //System.CodeDom.Compiler }; var refs = from a in assemblies select new MetadataFileReference(a.Location); var returnList = refs.ToList(); //The location of the .NET assemblies var assemblyPath = Path.GetDirectoryName(typeof(object).Assembly.Location); /* * Adding some necessary .NET assemblies * These assemblies couldn''t be loaded correctly via the same construction as above, * in specific the System.Runtime. */ returnList.Add(new MetadataFileReference(Path.Combine(assemblyPath, "mscorlib.dll"))); returnList.Add(new MetadataFileReference(Path.Combine(assemblyPath, "System.dll"))); returnList.Add(new MetadataFileReference(Path.Combine(assemblyPath, "System.Core.dll"))); returnList.Add(new MetadataFileReference(Path.Combine(assemblyPath, "System.Runtime.dll"))); return returnList; }

Al descompilar el System.Runtime.dll , también vi por qué no se podía hacer referencia a él de otra manera. La dll está vacía, solo contiene algunas referencias a otros ensamblajes. Por lo tanto, no se puede hacer referencia a este ensamblaje de ninguna otra manera.


Parece que estás haciendo referencia a una biblioteca portátil. Las bibliotecas de clases portátiles recogen algunos de los tipos básicos (como object / string / etc) de "System.Runtime.dll". Sin embargo, en el marco del escritorio estos vienen de mscorlib.dll. Cuando usa typeof(object).Assembly , obtiene la versión del object de Roslyn. Dado que Roslyn no está construido como bibliotecas de clases portátiles, es la de mscorlib y no coincide con la identidad de sus otras referencias.