Domanda

Sto lavorando su un progetto CodeDOM c # che fornisce agli utenti di compilare dinamicamente il codice C #. Sto ottenendo l'errore quando si aggiunge il montaggio dll di WPF (si sta lavorando bene per WinForms). Si sta dicendo che "Impossibile trovare il #### in assemblea. Vi manca qualche riferimento" quando provo ad aggiungere il riferimento come "System.Windows.Media". Ma quando sto aggiungendo il riferimento per il suo percorso dll come "C: \ Program Files \ assembly di riferimento \ Microsoft \ Framework \ v3.0 \ System.Printing.dll" allora sta dicendo che "File C: \ Program Files \ Reference Assemblies \ Microsoft \ Framework \ v3.0 \ System.Printing.dll non trovato" bene, ma quando ho posto lo System.Printing.dll alla cartella eseguibile dell'applicazione, si sta lavorando.

In seguito è il codice che sto usando per aggiungere il riferimento opzione del compilatore a:

CompilerParameters oParameters;
:
:
:
string lcAssemblyDll="C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\System.Printing.dll";
oParameters.ReferencedAssemblies.Add(lcAssemblyDll);

Io non sono in grado di capire il problema. Inoltre v'è un altro approccio per aggiungere gli assembly WPF?

Grazie

È stato utile?

Soluzione

Beh, non posso fornire una risposta esauriente al largo della parte superiore della mia testa, ma prima di tutto è necessario rendersi conto che un riferimento di compilazione non è lo stesso di essere in grado di risolvere un assemblaggio durante l'esecuzione dell'applicazione. Quindi, se questo errore è stato dato durante l'esecuzione dell'applicazione posso immaginare che gettare typeloader eccezioni.

In secondo luogo si sono probabilmente trovato "Impossibile trovare il #### in assemblea. Vi manca qualche riferimento", perché tipi di base di classi che dipendono risiedono nelle assemblee a cui lo System.Windows.Media si riferiva.

Si potrebbe provare a risolvere questo l'aggiunta di riferimenti a gruppi che vengono caricati durante Assembly.ReflectionOnlyLoad delle assemblee che si desidera di cui. Se si aggiunge un gestore eventi per AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve, è possibile aggiungere il codice che fa riferimento che tali assemblee possono essere caricati e poi semplicemente si aggiungono alla CodeCompileUnit.

Ho incontrato un problema con questo però e che è stato che alcuni riferimenti vengono ottimizzati via durante la compilazione, così ho implementato un brutto hack che semplicemente aggiunge una classe contenitore al CodeCompileUnit che initializies il primo tipo costruibile trovato in ciascuno di tali assiemi.

La speranza che aiuta un po '.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top