OVH Cloud OVH Cloud

Chargement d'une assembly dans un domain depuis un fichier

9 réponses
Avatar
Yaume
Bonjour,

Je cherche despérement le moyen de charger une assembly depuis le nom de
fichier (path compris) dans un AppDomain qui n'est pas l'AppDomain courrant.
J'ai bien essayé de charger le fichier en byte[] et d'utiliser Assembly.Load
mais j'ai systématiquement un message d'erreur sur un manque d'information
pour la desérialisation. De plus j'ai peur que cette méthode pose des
problèmes pour les dépendances de la dll.
Quelqu'un peut-il m'aider ?

D'avance merci.

9 réponses

Avatar
Paul Bacelar
Avant de chager un assembly, pensez à créer un AppDomain.

<MSDN>
// Set up the AppDomainSetup
AppDomainSetup setup = new AppDomainSetup();
setup.ApplicationBase = "(some directory)";
setup.ConfigurationFile = "(some file)";

// Set up the Evidence
Evidence baseEvidence = AppDomain.CurrentDomain.Evidence;
Evidence evidence = new Evidence(baseEvidence);
evidence.AddAssembly("(some assembly)");
evidence.AddHost("(some host)");

// Create the AppDomain
AppDomain newDomain = AppDomain.CreateDomain("newDomain", evidence, setup);

</MSDN>
--
Paul Bacelar

"Yaume" wrote in message
news:
Bonjour,

Je cherche despérement le moyen de charger une assembly depuis le nom de
fichier (path compris) dans un AppDomain qui n'est pas l'AppDomain


courrant.
J'ai bien essayé de charger le fichier en byte[] et d'utiliser


Assembly.Load
mais j'ai systématiquement un message d'erreur sur un manque d'information
pour la desérialisation. De plus j'ai peur que cette méthode pose des
problèmes pour les dépendances de la dll.
Quelqu'un peut-il m'aider ?

D'avance merci.


Avatar
Yaume
Bonjour,

Je crée effectivement un domaine auparavent. De la même façon que vous me
l'indiquez. Toute fois je ne spécifie pas :
- de fichier de configuration
- d'assembly (pas de AddAssembly sur l'evidence)
- de Host (pas de AddHost sur l'évidence)

J'ajoute 2 précisions :
- l'assembly est dans une Class Librairy, et non dans un executable.
- la dll est dans un répertoire différent de celui de mon application (et ce
n'est pas un sous-repertoire).

Cordialement

"Paul Bacelar" a écrit :

Avant de chager un assembly, pensez à créer un AppDomain.

<MSDN>
// Set up the AppDomainSetup
AppDomainSetup setup = new AppDomainSetup();
setup.ApplicationBase = "(some directory)";
setup.ConfigurationFile = "(some file)";

// Set up the Evidence
Evidence baseEvidence = AppDomain.CurrentDomain.Evidence;
Evidence evidence = new Evidence(baseEvidence);
evidence.AddAssembly("(some assembly)");
evidence.AddHost("(some host)");

// Create the AppDomain
AppDomain newDomain = AppDomain.CreateDomain("newDomain", evidence, setup);

</MSDN>
--
Paul Bacelar

"Yaume" wrote in message
news:
> Bonjour,
>
> Je cherche despérement le moyen de charger une assembly depuis le nom de
> fichier (path compris) dans un AppDomain qui n'est pas l'AppDomain
courrant.
> J'ai bien essayé de charger le fichier en byte[] et d'utiliser
Assembly.Load
> mais j'ai systématiquement un message d'erreur sur un manque d'information
> pour la desérialisation. De plus j'ai peur que cette méthode pose des
> problèmes pour les dépendances de la dll.
> Quelqu'un peut-il m'aider ?
>
> D'avance merci.





Avatar
Yaume
J'ai lu quelque part qu'il fallait faire un stub qui s'occuperait du
chargement de l'assembly. Mais je ne trouve pas comment faire cela. Quelqu'un
sait-il ?

D'avance merci.

"Yaume" a écrit :

Bonjour,

Je cherche despérement le moyen de charger une assembly depuis le nom de
fichier (path compris) dans un AppDomain qui n'est pas l'AppDomain courrant.
J'ai bien essayé de charger le fichier en byte[] et d'utiliser Assembly.Load
mais j'ai systématiquement un message d'erreur sur un manque d'information
pour la desérialisation. De plus j'ai peur que cette méthode pose des
problèmes pour les dépendances de la dll.
Quelqu'un peut-il m'aider ?

D'avance merci.


Avatar
Simon Mourier
Le plus simple c'est ceci:

Assembly asm =
myDomain.Load(AssemblyName.GetAssemblyName(@"c:tototiti.dll"));

mais le mieux c'est de faire

Assembly asm =
Assembly.Load(AssemblyName.GetAssemblyName(@"c:tototiti.dll"));

à partir de l'AppDomain lui-même

Simon
www.softfluent.com

"Yaume" a écrit dans le message de news:

Bonjour,

Je cherche despérement le moyen de charger une assembly depuis le nom de
fichier (path compris) dans un AppDomain qui n'est pas l'AppDomain
courrant.
J'ai bien essayé de charger le fichier en byte[] et d'utiliser
Assembly.Load
mais j'ai systématiquement un message d'erreur sur un manque d'information
pour la desérialisation. De plus j'ai peur que cette méthode pose des
problèmes pour les dépendances de la dll.
Quelqu'un peut-il m'aider ?

D'avance merci.


Avatar
Yaume
Merci,
La première méthode me plaît beaucoup plus que le chargement en tableau de
byte.
Par contre j'ai toujours le même problème. A savoir qu'il me dit
"Insufficient state to deserialize the object. More information is needed.".

La deuxième méthode me semble encore mieux. Malheureusement je ne sais pas
comment le faire à partir du domain lui-même. J'ai mon domaine dans une
variable comment faire pour se placer dedans ?

D'avance merci.

"Simon Mourier" a écrit :

Le plus simple c'est ceci:

Assembly asm =
myDomain.Load(AssemblyName.GetAssemblyName(@"c:tototiti.dll"));

mais le mieux c'est de faire

Assembly asm =
Assembly.Load(AssemblyName.GetAssemblyName(@"c:tototiti.dll"));

à partir de l'AppDomain lui-même

Simon
www.softfluent.com

"Yaume" a écrit dans le message de news:

> Bonjour,
>
> Je cherche despérement le moyen de charger une assembly depuis le nom de
> fichier (path compris) dans un AppDomain qui n'est pas l'AppDomain
> courrant.
> J'ai bien essayé de charger le fichier en byte[] et d'utiliser
> Assembly.Load
> mais j'ai systématiquement un message d'erreur sur un manque d'information
> pour la desérialisation. De plus j'ai peur que cette méthode pose des
> problèmes pour les dépendances de la dll.
> Quelqu'un peut-il m'aider ?
>
> D'avance merci.





Avatar
Simon Mourier
A priori il faut utiliser les méthodes CreateInstance de AppDomain
Simon.

"Yaume" a écrit dans le message de news:

Merci,
La première méthode me plaît beaucoup plus que le chargement en tableau de
byte.
Par contre j'ai toujours le même problème. A savoir qu'il me dit
"Insufficient state to deserialize the object. More information is
needed.".

La deuxième méthode me semble encore mieux. Malheureusement je ne sais pas
comment le faire à partir du domain lui-même. J'ai mon domaine dans une
variable comment faire pour se placer dedans ?

D'avance merci.

"Simon Mourier" a écrit :

Le plus simple c'est ceci:

Assembly asm >> myDomain.Load(AssemblyName.GetAssemblyName(@"c:tototiti.dll"));

mais le mieux c'est de faire

Assembly asm >> Assembly.Load(AssemblyName.GetAssemblyName(@"c:tototiti.dll"));

à partir de l'AppDomain lui-même

Simon
www.softfluent.com

"Yaume" a écrit dans le message de
news:

> Bonjour,
>
> Je cherche despérement le moyen de charger une assembly depuis le nom
> de
> fichier (path compris) dans un AppDomain qui n'est pas l'AppDomain
> courrant.
> J'ai bien essayé de charger le fichier en byte[] et d'utiliser
> Assembly.Load
> mais j'ai systématiquement un message d'erreur sur un manque
> d'information
> pour la desérialisation. De plus j'ai peur que cette méthode pose des
> problèmes pour les dépendances de la dll.
> Quelqu'un peut-il m'aider ?
>
> D'avance merci.







Avatar
Yaume
le problème est que je ne veut pas instancier d'objet (je ne veut pas
executer leur constructeur). Le but est seulement de faire de la reflexion
dessus.
De plus pour utiliser l'un des createInstance il me faut connaitre un type
contenu dans la dll. Ce que je n'ai pas.

En fait le but est trés simple je veut a partir d'un chemin de dll faire une
petite analyse de cette dernière. Il suffit donc d'utiliser Assembly.Load.
Mais je veut pouvoir décharger la dll une fois l'analyse terminée. Comme a
priori on ne peut décharger une assembly qu'en déchargeant son application,
je cherche à la chargerdans une autre application.


"Simon Mourier" a écrit :

A priori il faut utiliser les méthodes CreateInstance de AppDomain
Simon.

"Yaume" a écrit dans le message de news:

> Merci,
> La première méthode me plaît beaucoup plus que le chargement en tableau de
> byte.
> Par contre j'ai toujours le même problème. A savoir qu'il me dit
> "Insufficient state to deserialize the object. More information is
> needed.".
>
> La deuxième méthode me semble encore mieux. Malheureusement je ne sais pas
> comment le faire à partir du domain lui-même. J'ai mon domaine dans une
> variable comment faire pour se placer dedans ?
>
> D'avance merci.
>
> "Simon Mourier" a écrit :
>
>> Le plus simple c'est ceci:
>>
>> Assembly asm > >> myDomain.Load(AssemblyName.GetAssemblyName(@"c:tototiti.dll"));
>>
>> mais le mieux c'est de faire
>>
>> Assembly asm > >> Assembly.Load(AssemblyName.GetAssemblyName(@"c:tototiti.dll"));
>>
>> à partir de l'AppDomain lui-même
>>
>> Simon
>> www.softfluent.com
>>
>> "Yaume" a écrit dans le message de
>> news:
>>
>> > Bonjour,
>> >
>> > Je cherche despérement le moyen de charger une assembly depuis le nom
>> > de
>> > fichier (path compris) dans un AppDomain qui n'est pas l'AppDomain
>> > courrant.
>> > J'ai bien essayé de charger le fichier en byte[] et d'utiliser
>> > Assembly.Load
>> > mais j'ai systématiquement un message d'erreur sur un manque
>> > d'information
>> > pour la desérialisation. De plus j'ai peur que cette méthode pose des
>> > problèmes pour les dépendances de la dll.
>> > Quelqu'un peut-il m'aider ?
>> >
>> > D'avance merci.
>>
>>
>>





Avatar
Simon Mourier
Oui c'est ce que je disais, mais je me suis mal exprimé, il faut créer
l'instance d'un objet remote qui va faire le travail. Voici le code:
Simon.
www.softfluent.com

public class RemoteLoader
{
public RemoteLoader(string asmPath)
{
Assembly asm =
AppDomain.CurrentDomain.Load(AssemblyName.GetAssemblyName(asmPath));
Console.WriteLine("domain=" + AppDomain.CurrentDomain.FriendlyName); //
affiche "test"
}
}

class Class1
{
[STAThread]
static void Main(string[] args)
{
AppDomain domain = AppDomain.CreateDomain("test");

string path = @"......ClassLibrary1bindebugClassLibrary1.dll";
domain.CreateInstance(Assembly.GetExecutingAssembly().FullName,
typeof(RemoteLoader).FullName,
false, BindingFlags.CreateInstance | BindingFlags.Public |
BindingFlags.Instance,
null, new object[]{path}, null, null, null);

}
}


"Yaume" a écrit dans le message de news:

le problème est que je ne veut pas instancier d'objet (je ne veut pas
executer leur constructeur). Le but est seulement de faire de la reflexion
dessus.
De plus pour utiliser l'un des createInstance il me faut connaitre un type
contenu dans la dll. Ce que je n'ai pas.

En fait le but est trés simple je veut a partir d'un chemin de dll faire
une
petite analyse de cette dernière. Il suffit donc d'utiliser Assembly.Load.
Mais je veut pouvoir décharger la dll une fois l'analyse terminée. Comme a
priori on ne peut décharger une assembly qu'en déchargeant son
application,
je cherche à la chargerdans une autre application.


"Simon Mourier" a écrit :

A priori il faut utiliser les méthodes CreateInstance de AppDomain
Simon.

"Yaume" a écrit dans le message de
news:

> Merci,
> La première méthode me plaît beaucoup plus que le chargement en tableau
> de
> byte.
> Par contre j'ai toujours le même problème. A savoir qu'il me dit
> "Insufficient state to deserialize the object. More information is
> needed.".
>
> La deuxième méthode me semble encore mieux. Malheureusement je ne sais
> pas
> comment le faire à partir du domain lui-même. J'ai mon domaine dans une
> variable comment faire pour se placer dedans ?
>
> D'avance merci.
>
> "Simon Mourier" a écrit :
>
>> Le plus simple c'est ceci:
>>
>> Assembly asm >> >> myDomain.Load(AssemblyName.GetAssemblyName(@"c:tototiti.dll"));
>>
>> mais le mieux c'est de faire
>>
>> Assembly asm >> >> Assembly.Load(AssemblyName.GetAssemblyName(@"c:tototiti.dll"));
>>
>> à partir de l'AppDomain lui-même
>>
>> Simon
>> www.softfluent.com
>>
>> "Yaume" a écrit dans le message de
>> news:
>>
>> > Bonjour,
>> >
>> > Je cherche despérement le moyen de charger une assembly depuis le
>> > nom
>> > de
>> > fichier (path compris) dans un AppDomain qui n'est pas l'AppDomain
>> > courrant.
>> > J'ai bien essayé de charger le fichier en byte[] et d'utiliser
>> > Assembly.Load
>> > mais j'ai systématiquement un message d'erreur sur un manque
>> > d'information
>> > pour la desérialisation. De plus j'ai peur que cette méthode pose
>> > des
>> > problèmes pour les dépendances de la dll.
>> > Quelqu'un peut-il m'aider ?
>> >
>> > D'avance merci.
>>
>>
>>







Avatar
Yaume
Effectivement ça marche pas mal.
Il reste cependant un petit soucis. En effet mon assembly contenant le
RemoteLoader (l'application en fait) et l'assembly à charger dynamiquement ne
sont pas du tout dans le même répertoire. ainsi si je demande à charger une
des assemblies obtenues dans le GetReferencedAssemblies et bien cela ne
marche pas.
Inversement si j'indique que le répertoire de base du nouveau domaine est
celui de la dll alors je ne sais plus charger RemoteLoader.

Cordialement.

"Simon Mourier" a écrit :

Oui c'est ce que je disais, mais je me suis mal exprimé, il faut créer
l'instance d'un objet remote qui va faire le travail. Voici le code:
Simon.
www.softfluent.com

public class RemoteLoader
{
public RemoteLoader(string asmPath)
{
Assembly asm =
AppDomain.CurrentDomain.Load(AssemblyName.GetAssemblyName(asmPath));
Console.WriteLine("domain=" + AppDomain.CurrentDomain.FriendlyName); //
affiche "test"
}
}

class Class1
{
[STAThread]
static void Main(string[] args)
{
AppDomain domain = AppDomain.CreateDomain("test");

string path = @"......ClassLibrary1bindebugClassLibrary1.dll";
domain.CreateInstance(Assembly.GetExecutingAssembly().FullName,
typeof(RemoteLoader).FullName,
false, BindingFlags.CreateInstance | BindingFlags.Public |
BindingFlags.Instance,
null, new object[]{path}, null, null, null);

}
}


"Yaume" a écrit dans le message de news:

> le problème est que je ne veut pas instancier d'objet (je ne veut pas
> executer leur constructeur). Le but est seulement de faire de la reflexion
> dessus.
> De plus pour utiliser l'un des createInstance il me faut connaitre un type
> contenu dans la dll. Ce que je n'ai pas.
>
> En fait le but est trés simple je veut a partir d'un chemin de dll faire
> une
> petite analyse de cette dernière. Il suffit donc d'utiliser Assembly.Load.
> Mais je veut pouvoir décharger la dll une fois l'analyse terminée. Comme a
> priori on ne peut décharger une assembly qu'en déchargeant son
> application,
> je cherche à la chargerdans une autre application.
>
>
> "Simon Mourier" a écrit :
>
>> A priori il faut utiliser les méthodes CreateInstance de AppDomain
>> Simon.
>>
>> "Yaume" a écrit dans le message de
>> news:
>>
>> > Merci,
>> > La première méthode me plaît beaucoup plus que le chargement en tableau
>> > de
>> > byte.
>> > Par contre j'ai toujours le même problème. A savoir qu'il me dit
>> > "Insufficient state to deserialize the object. More information is
>> > needed.".
>> >
>> > La deuxième méthode me semble encore mieux. Malheureusement je ne sais
>> > pas
>> > comment le faire à partir du domain lui-même. J'ai mon domaine dans une
>> > variable comment faire pour se placer dedans ?
>> >
>> > D'avance merci.
>> >
>> > "Simon Mourier" a écrit :
>> >
>> >> Le plus simple c'est ceci:
>> >>
>> >> Assembly asm > >> >> myDomain.Load(AssemblyName.GetAssemblyName(@"c:tototiti.dll"));
>> >>
>> >> mais le mieux c'est de faire
>> >>
>> >> Assembly asm > >> >> Assembly.Load(AssemblyName.GetAssemblyName(@"c:tototiti.dll"));
>> >>
>> >> à partir de l'AppDomain lui-même
>> >>
>> >> Simon
>> >> www.softfluent.com
>> >>
>> >> "Yaume" a écrit dans le message de
>> >> news:
>> >>
>> >> > Bonjour,
>> >> >
>> >> > Je cherche despérement le moyen de charger une assembly depuis le
>> >> > nom
>> >> > de
>> >> > fichier (path compris) dans un AppDomain qui n'est pas l'AppDomain
>> >> > courrant.
>> >> > J'ai bien essayé de charger le fichier en byte[] et d'utiliser
>> >> > Assembly.Load
>> >> > mais j'ai systématiquement un message d'erreur sur un manque
>> >> > d'information
>> >> > pour la desérialisation. De plus j'ai peur que cette méthode pose
>> >> > des
>> >> > problèmes pour les dépendances de la dll.
>> >> > Quelqu'un peut-il m'aider ?
>> >> >
>> >> > D'avance merci.
>> >>
>> >>
>> >>
>>
>>
>>