Chargement dynamique de type [Résolu]

Signaler
Messages postés
186
Date d'inscription
lundi 11 mars 2002
Statut
Membre
Dernière intervention
30 novembre 2010
-
cs_coq
Messages postés
6352
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
-
Bonjour a tous,


Je voudrais faire un chargement dynamique d'assembly à partir d'un nom complet de type


Par exemple, j'ai la valeur suivante "System.Windows.Form.ButtonBase" et je voudrais charger sont Type afin d'obtenir des informations par réflexion.


J'ai essayé différente surcharge de la méthode Assembly.Load() sans succès.


Merci pour votre aide


Nico

7 réponses

Messages postés
6352
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
79
En fait ce ne sera pas forcément nécessaire, tu peux te baser sur le wrapper écris par Junfeng Zhang : http://blogs.msdn.com/junfeng/articles/229649.aspx

/*
coq
MVP Visual C#
CoqBlog
*/
Messages postés
6352
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
79
Salut,

Assembly.Load permet de charger un assembly dans le domaine d'application courant.
Tu devras le faire si l'assembly dans lequel se trouve le type désiré n'est pas déjà chargé.
Pour le type tu vas devoir utiliser par exemple une des méthodes Type.GetType.

/*
coq
MVP Visual C#
CoqBlog
*/
Messages postés
186
Date d'inscription
lundi 11 mars 2002
Statut
Membre
Dernière intervention
30 novembre 2010
2
Merci pour cette réponse Coq mais c'est vrai que ma question n'est pas trés clair.

Je suis en train de faire un générateur de Doc et je risque de rencontrer des références vers des types qui ne sont pas chargés.

J'ai besoin de charger ces types référencés pour obtenir des infos

Type.GetType() retourne null si le type n'est pas dispo (ex : Type.GetType("System.Windows.Forms.Button") dans une application type Console sans référence vers System.Windows.Forms.

Ce que je n'arrive pas a faire.

Retrouver un Type qui serait dans un assembly situé le GAC ou dans une liste de répertoire prédéfine dans la config.

Voila mon probleme

Merci pour ton aide

A+

Nico
Messages postés
6352
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
79
Sans charger les assembly ce ne sera pas possible de déterminer s'ils contiennent le type.

Concernant le listing des assemblys du GAC, il y'a un peu de boulot d'appel aux APIs de Fusion, ce n'est pas à ma connaissance directement accessible.
Je regarde pour te faire un petit exemple.

/*
coq
MVP Visual C#
CoqBlog
*/
Messages postés
186
Date d'inscription
lundi 11 mars 2002
Statut
Membre
Dernière intervention
30 novembre 2010
2
Merci pour ton aide Coq

Pour ceux que ca intéresse...
Un p'tit exemple tout fait a partir du Wrapper de Junfeng Zhang


using System;
using System.Reflection;
using System.GACManagedAccess;



internal static void Main()
{

// Création de l'énumérateur
AssemblyCacheEnum oEnumerator = new AssemblyCacheEnum(null);

// Lecture du 1er assembly
string sAssemblyName = oEnumerator.GetNextAssembly();
while (sAssemblyName != null)
{

// Création de la référence vers l'assembly
AssemblyName oAssemblyName = new AssemblyName(sAssemblyName);
System.Diagnostics.Debug.WriteLine(oAssemblyName.Name);

// Test de chargement d'un assembly
if (oAssemblyName.Name.Equals("Microsoft.VisualC.VSCodeParser"))
{
Assembly oAssembly = Assembly.Load(oAssemblyName);
System.Diagnostics.Debug.WriteLine(oAssembly.FullName);
}

// Lecture du prochain assembly
sAssemblyName = oEnumerator.GetNextAssembly();
}

}



Nico
Messages postés
186
Date d'inscription
lundi 11 mars 2002
Statut
Membre
Dernière intervention
30 novembre 2010
2
Salut,

Pour ceux que ca intéresse, voici la source ou j'ai utilisé la réponse de coq :
http://www.csharpfr.com/code.aspx?ID=44645

Nico
Messages postés
6352
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
79
Ca c'est du suivi de question, cool ! :-)

/*
coq
MVP Visual C#
CoqBlog
*/