Sto cercando di capire se è possibile generare dinamicamente gli assiemi, fare riferimento a un tipo in un assieme generato dinamicamente in precedenza.C# - Riferimento a un tipo in un assieme generato dinamicamente
Ad esempio:
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;
}
Questo codice stampa il seguente sulla console: The type or namespace name 'A' could not be found (are you missing a using directive or an assembly reference?)
ho provato un sacco di modi diversi, ma nulla sembra funzionare. Mi sto perdendo qualcosa? È possibile?
EDIT: Risolvere il bug nel codice fornisce questo errore invece: Metadata file 'l0livsmn, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' could not be found
EDIT2: un po 'di una nota a margine, ma cambiando GenerateInMemory false, e facendo parameters2.ReferencedAssemblies.Add(assem.Location);
causerà a compilare correttamente, ma io' Preferisco di gran lunga fare riferimento all'assembly che è direttamente in memoria piuttosto che emettere file temporanei.
Ah, spara. Grazie! L'ho riparato. Vedi la modifica. – Ashley
Vedere la mia seconda modifica. Penso che lo abbiamo capito all'incirca alla stessa ora. Mi piacerebbe comunque poter fare riferimento all'assembly in memoria, se possibile. – Ashley
Sembra che il codice sorgente venga eseguito e creato il secondo assembly. Ma se provi a caricare i tipi risiedi nel secondo assembly (usando assem2.GetTypes()), riceverai una ReflectionTypeLoadException –