2013-08-13 13 views
5

Ho una soluzione con due assembly, uno di questi è denominato dominio e contiene una classe Book e una classe Author.Impossibile trovare il file dei metadati "Domain.dll" quando si utilizza il progetto di riferimento CSharpCodeProvider

Voglio creare dinamicamente una classe che eredita dalla classe Book. Qui è il mio codice:

public Book CreateBookProxy(Book book) 
    { 
     CSharpCodeProvider cscp = new CSharpCodeProvider(new Dictionary<String, String> { { "CompilerVersion", "v3.5" } }); 
     var parameters = new CompilerParameters(new[] { "mscorlib.dll", "System.Core.dll", "Domain.dll" }, "Proxies.dll", false); 
     parameters.GenerateExecutable = false; 

     var compileUnit = new CodeCompileUnit(); 
     var ns = new CodeNamespace("Proxies"); 
     compileUnit.Namespaces.Add(ns); 
     ns.Imports.Add(new CodeNamespaceImport("System")); 
     ns.Imports.Add(new CodeNamespaceImport("Domain")); 

     var classType = new CodeTypeDeclaration("BookProxy"); 
     classType.Attributes = MemberAttributes.Public; 
     classType.BaseTypes.Add(new CodeTypeReference(typeof(Book))); 
     ns.Types.Add(classType); 
     var results = cscp.CompileAssemblyFromDom(parameters, compileUnit); 

     List<string> errors = new List<string>(); 
     errors.AddRange(results.Errors.Cast<CompilerError>().Select(e => e.ErrorText)); 

     return Activator.CreateInstance(Type.GetType("Proxies.BookProxy, Proxies")) as Book; 
    } 

Comunque sto ottenendo il seguente errore:

Metadata file 'Domain.dll' could not be found

Domain.dll viene fatto riferimento nel mio start up del progetto in modo che esiste nella cartella bin in fase di esecuzione.

È interessante notare Assembly.Load ("Domain.dll"); genera un FileNotFoundException

Come posso risolvere questo problema?

+0

Dove è la DLL? – SLaks

+0

Fa parte della soluzione ed esiste nella cartella bin in fase di esecuzione – Liath

risposta

10

Vorrei suggerire esplicitamente specificare la posizione del Domain.dll come segue:

parameters.ReferencedAssemblies.Add(typeof(<TYPE FROM DOMAIN.DLL>).Assembly.Location); 
+0

Cosa succede se non si conosce ancora il tipo che si desidera caricare? –

+0

@WilkovanderVeen Quindi è necessario conoscere il percorso completo dell'assembly o della directory con assembly che deve essere specificato nell'elemento [probing] (https://msdn.microsoft.com/en-us/library/823z9h8w.aspx) in config file. –

Problemi correlati