Estoy tratando de averiguar si es posible cuando se generan ensamblajes dinámicamente, para hacer referencia a un tipo en un ensamblaje generado dinámicamente previamente.C# - Hacer referencia a un tipo en un ensamblaje generado de forma dinámica
Por ejemplo:
using System;
using System.CodeDom.Compiler;
using System.Reflection;
using Microsoft.CSharp;
CodeDomProvider provider = new CSharpCodeProvider();
CompilerParameters parameters = new CompilerParameters();
parameters.GenerateInMemory = true;
CompilerResults results = provider.CompileAssemblyFromSource(parameters, @"
namespace Dynamic
{
public class A
{
}
}
");
Assembly assem = results.CompiledAssembly;
CodeDomProvider provider2 = new CSharpCodeProvider();
CompilerParameters parameters2 = new CompilerParameters();
parameters2.ReferencedAssemblies.Add(assem.FullName);
parameters2.GenerateInMemory = true;
CompilerResults results2 = provider2.CompileAssemblyFromSource(parameters2, @"
namespace Dynamic
{
public class B : A
{
}
}
");
if (results2.Errors.HasErrors)
{
foreach (CompilerError error in results2.Errors)
{
Console.WriteLine(error.ErrorText);
}
}
else
{
Assembly assem2 = results2.CompiledAssembly;
}
Este código imprime lo siguiente en la consola: The type or namespace name 'A' could not be found (are you missing a using directive or an assembly reference?)
Lo he intentado un montón de diferentes maneras, pero nada parece estar funcionando. ¿Me estoy perdiendo de algo? ¿Esto es posible?
EDIT: La fijación del error en el código ofrece este error en su lugar: Metadata file 'l0livsmn, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' could not be found
Edit2: Un poco de una nota al margen, pero cambiando GenerateInMemory a falso, y haciendo parameters2.ReferencedAssemblies.Add(assem.Location);
hará que se compila correctamente, pero yo' Preferiría mucho hacer referencia al ensamblaje que está directamente en la memoria en lugar de enviar archivos temporales.
Ah, disparar. ¡Gracias! Lo arreglé. Ver la edición. – Ashley
Ver mi segunda edición. Creo que lo descubrimos casi al mismo tiempo. Todavía me gustaría poder hacer referencia al ensamblaje en memoria, si es posible. – Ashley
Parece que el código fuente se ejecuta y creó el segundo conjunto. Pero si intenta cargar los tipos residen en el segundo ensamblado (usando assem2.GetTypes()), obtendrá una ReflectionTypeLoadException –