Question

Je travaille sur un projet c # CodeDOM qui permet aux utilisateurs de compiler dynamiquement le code c #. Je reçois l'erreur lors de l'ajout dll assemblage de WPF (il fonctionne très bien pour WinForms). Il dit que « Vous ne trouvez pas dans l'assemblage ####. Manque des références que vous » lorsque je tente d'ajouter la référence comme « System.Windows.Media ». Mais quand je suis en ajoutant la référence par son chemin dll comme "C: \ Program Files \ référence Assemblies \ Microsoft \ Framework \ v3.0 \ System.Printing.dll" il dit que « Fichier C: \ Program Files \ Référence assemblées de Microsoft \ Framework \ v3.0 \ System.Printing.dll not found » mais quand je place le System.Printing.dll dans le dossier exécutable de l'application, il fonctionne très bien.

Voici le code que je utilise pour ajouter la référence à l'option du compilateur:

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

Je ne suis pas en mesure de comprendre le problème. Aussi est-il une autre approche pour ajouter les assemblées WPF?

Merci

Était-ce utile?

La solution

Eh bien, je ne peux pas donner une réponse complète du haut de ma tête, mais d'abord de tout ce que vous devez réaliser qu'une référence de compilation n'est pas la même chose qu'être en mesure de résoudre un ensemble lors de l'exécution de l'application. Donc, si cette erreur a été donnée lors de l'exécution de l'application, je peux l'imaginer lancer typeloader exceptions.

Deuxièmement, vous êtes probablement trouvé « Vous ne trouvez pas dans l'assemblage ####. Il vous manque une référence », car les types de base de classes que vous dépendent résident dans les assemblées auxquelles le System.Windows.Media fait allusion.

Vous pouvez essayer de résoudre ce en ajoutant des références à des ensembles, qui sont chargées pendant Assembly.ReflectionOnlyLoad des assemblées que vous voulez mentionnés. Si vous ajoutez un gestionnaire d'événements pour AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve, vous pouvez ajouter du code qui fait que ces ensembles peuvent être chargés, puis il suffit d'ajouter des références à la CodeCompileUnit.

J'ai couru en un seul problème avec cette même et était que quelques références pas optimisés lors de la compilation, donc je mis en œuvre un hack méchant qui ajoute simplement une classe de conteneur à l'CodeCompileUnit qui initializies le premier type constructible trouvé dans chacun de ces assemblages.

L'espoir qui aide un peu.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top