OVH Cloud OVH Cloud

Assembly en folie

11 réponses
Avatar
Delf
Bonsoir, je deviens taré !

Voici une méthode simplifiée qui charge une librairie/module:

public void LoadModule(string pModulePath)
{
if (Path.GetExtension(pModulePath) == ".dll")
{
Assembly module = Assembly.LoadFrom(pModulePath);

foreach (Type moduleType in module.GetTypes())
{
if (moduleType.IsPublic)
{
if (!moduleType.IsAbstract)
{
Type interfaceType =
moduleType.GetInterface("IModule", true);

if (interfaceType != null)
{
IModule moduleToLoad =

(IModule)Activator.CreateInstance(module.GetType(moduleType.ToString()));

// ...
}
}
}
}
}
}

Bien, si j'appelle cette méthode avec 2 dll différentes, l'objet
'module' est toujours le même, c'est-à-dire, le premier créé lors du
premier appel... je comprends plus rien, j'ai besoin d'explications.

Merci d'avance.

--
Delf

10 réponses

1 2
Avatar
Fred
dans : news:,
Delf écrivait :

Bonsoir, je deviens taré !

Voici une méthode simplifiée qui charge une librairie/module:



[...]
Assembly module = Assembly.LoadFrom(pModulePath);



Bien, si j'appelle cette méthode avec 2 dll différentes, l'objet
'module' est toujours le même, c'est-à-dire, le premier créé lors du
premier appel... je comprends plus rien, j'ai besoin d'explications.



C'est exactement le comportement spécifié dans l'aide en ligne !
Je t'invite à examiner et tester dans le détail les trois méthodes Load,
LoadFrom et LoadFile.
Je pense que le load serait plus approprié dans ton cas (?)

--
Fred
http://www.cerbermail.com/?3kA6ftaCvT
Avatar
Delf
Fred a formulé la demande :

Je pense que le load serait plus approprié dans ton cas (?)



.Load() ne permet pas de charger une DLL via son path apparemment.

--
Delf
Avatar
Delf
Fred a exprimé avec précision :

C'est exactement le comportement spécifié dans l'aide en ligne !



Pourrais-tu me fournir le lien exact s'il te plait ?
Merci.

--
Delf
Avatar
Fred
dans : news:,
Delf écrivait :

Fred a formulé la demande :

Je pense que le load serait plus approprié dans ton cas (?)



.Load() ne permet pas de charger une DLL via son path apparemment.



Exact.
J'utilise ReflectionOnlyLoadFrom

currentAssembly = Assembly.ReflectionOnlyLoadFrom(dllFile.FullName)

Puis, plus loin, après divers tests.

currentAssembly = Assembly.Load(currentAssembly.GetName)


J'ajouterai que tu risques d'avoir des soucis avec les fichiers
satellites comme les fichiers ressources avec LoadFrom ou LoadFile (à
revérifier, je ne me souviens plus exactement).


--
Fred
http://www.cerbermail.com/?3kA6ftaCvT
Avatar
Fred
dans : news:,
Delf écrivait :

Fred a exprimé avec précision :

C'est exactement le comportement spécifié dans l'aide en ligne !



Pourrais-tu me fournir le lien exact s'il te plait ?
Merci.



Je parle de la MSDN library (excuse-moi pour le lapsus «aide en ligne»).
Mais tu peux trouver l'équivalent ici :
http://msdn2.microsoft.com/en-us/library/1009fa28.aspx

--
Fred
http://www.cerbermail.com/?3kA6ftaCvT
Avatar
Delf
Fred a écrit :

J'utilise ReflectionOnlyLoadFrom

currentAssembly = Assembly.ReflectionOnlyLoadFrom(dllFile.FullName)

Puis, plus loin, après divers tests.

currentAssembly = Assembly.Load(currentAssembly.GetName)



Je charge 2 modules avec 2 paths différents, le premier est chargé et
lors du chargement du second, exception: "... has already loaded from a
different location..."

Je ne comprends pas pourquoi il ne fait pas de distinction ?
Qu'est-ce-qui fait que je ne puissse pas charger mes deux modules ? Ou
alors avec la première méthode, il me créer une assembly similaire...

Merci

--
Delf
Avatar
Delf
Delf a présenté l'énoncé suivant :

[...]



De la magie, problème résolu. Je sais pas comment par contre :

--
Delf
Avatar
Delf
Delf a présenté l'énoncé suivant :

De la magie, problème résolu. Je sais pas comment par contre :



J'ai rien touché et que voilà, il recommence à loader toujours le même
module...

--
Delf
Avatar
Delf
Delf a couché sur son écran :

J'ai rien touché et que voilà, il recommence à loader toujours le même
module...



J'ai trouvé la source du problème : dans les propriétés de l'assembly,
les modules avaient le même nom d'assemblage... et vu que je générer
des modules fictifs depuis le même projet, forcément, même noms
d'assemblage.

--
Delf
Avatar
Delf
Delf avait écrit le 13/10/2006 :

J'ai trouvé la source du problème : dans les propriétés de l'assembly, les
modules avaient le même nom d'assemblage... et vu que je générer des modules
fictifs depuis le même projet, forcément, même noms d'assemblage.



Bordel...

Je fais un contrôle personnalisé pour afficher dans une WinForm les
informations concernant les modules, je reprends le même code, ça
plante.

L'Activator.CreateInstance() me retourne bien un objet de type
CModuleTest (module de Test).

CModTest étends une interface IModule.

Impossible de caster cet objet en IModule, alors que je n'ai pas de
problème avec mon service Windows.

object objTemp Activator.CreateInstance(assembly.GetType(moduleType.ToString()));

// Juste là, tout est bon, objTemp est de type ModTest.CModuleTest

IModule module = (IModule)objTemp;

Et là, exception:

"Unable to cast object of type 'ModTest.CModuleTest' to type
'X.Y.IModule'."

Pourquoi ? Je tiens à répéter que j'utilise le même code avec un
service Windows et que ça fonctionne.

Merci pour toute suggestion.

--
Delf
1 2