J'essaie de déterminer s'il est possible, lorsque vous générez dynamiquement des assemblages, de référencer un type dans un assemblage précédemment généré dynamiquement.C# - Référencer un type dans un assemblage généré dynamiquement
Par exemple:
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;
}
Ce code imprime ce qui suit sur la console: The type or namespace name 'A' could not be found (are you missing a using directive or an assembly reference?)
Je l'ai essayé beaucoup de façons différentes, mais rien ne semble fonctionner. Est-ce que je manque quelque chose? Est-ce seulement possible?
EDIT: Fixation du bug dans le code fournit cette erreur à la place: Metadata file 'l0livsmn, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' could not be found
EDIT2: Un peu d'une note de côté, mais en changeant GenerateInMemory false et faire parameters2.ReferencedAssemblies.Add(assem.Location);
le fera compiler correctement, mais je d préfèrent grandement faire référence à l'ensemble qui est directement en mémoire plutôt que de sortir des fichiers temporaires.
Ah, tirer. Merci! Je l'ai corrigé. Voir l'édition. – Ashley
Voir ma deuxième édition. Je pense que nous l'avons compris à peu près en même temps. J'aimerais quand même pouvoir référencer l'assemblage en mémoire, si possible. – Ashley
Il semble que le code source s'exécute et crée le second assembly. Mais si vous essayez de charger les types résident dans le second assembly (en utilisant assem2.GetTypes()), vous obtiendrez une ReflectionTypeLoadException –