Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Instanciation dynamique d'instance de type par chaine de caractè re

3 réponses
Avatar
Chnew
string = TcpChannel

J'aimerai instancier un type d'objet TcpChannel

je fais cela comme ceci

Type TypeChannel = cod.GetTypeFromAllAssemblies(maChaineType):
_Channel = Activator.CreateInstance(TypeChannel);

J'ai bien ajouter ma reference system.runtinme.remoting sur mon client.

ma fonction GetTypeFromAllAssemblies me retourne bien le type TcpChannel

mais elle ne me le retourne que lorsque j'ai deja utiliser une instance de
nimporte quel objet de cette Dll.

Or le but pour moi etant dinstancier dynamiquement nimporte quel type
d'objet sans me soucier à savoir si la Dll referencé a été chargée ou non...

comment faire ?



voici une partie de ma fonction


Assembly A ;
AssemblyName[] U;
U=Assembly.GetCallingAssembly().GetReferencedAssemblies();
foreach (AssemblyName An in U)
{
Console.WriteLine(An.Name);
if (isFound) break;
A = Assembly.Load(An);
foreach (Type Typ in A.GetExportedTypes())
{
if (Typ.Name.ToUpper()==Name.ToUpper())
{
T= Typ;
isFound=true;
break;
}
}
}

3 réponses

Avatar
Simon Mourier [SoftFluent]
Il faut utiliser la fonction statique

Type.GetType(string typeName);

Car elle permet d'utiliser l''assembly qualified name', c'est à dire une
chaine qui contient le nom de la classe, virgule, le nom de l'assembly
(complet ou partiel)
Exemple:

"System.String, System"
"MonNamespace.MaClass, MonAssembly"
"System.Data.DataSet, System.Data, Version=2.0.0.0"
etc...

Evidemment, il faut que le .NET Framework arrive à trouver l'assembly tout
seul par son algorithme standard pour que cela fonctionne. Sinon il faut la
charger avant dans l'AppDomain.

Simon.
www.softfluent.com


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

string = TcpChannel

J'aimerai instancier un type d'objet TcpChannel

je fais cela comme ceci

Type TypeChannel = cod.GetTypeFromAllAssemblies(maChaineType):
_Channel = Activator.CreateInstance(TypeChannel);

J'ai bien ajouter ma reference system.runtinme.remoting sur mon client.

ma fonction GetTypeFromAllAssemblies me retourne bien le type TcpChannel

mais elle ne me le retourne que lorsque j'ai deja utiliser une instance de
nimporte quel objet de cette Dll.

Or le but pour moi etant dinstancier dynamiquement nimporte quel type
d'objet sans me soucier à savoir si la Dll referencé a été chargée ou
non...

comment faire ?



voici une partie de ma fonction


Assembly A ;
AssemblyName[] U;
U=Assembly.GetCallingAssembly().GetReferencedAssemblies();
foreach (AssemblyName An in U)
{
Console.WriteLine(An.Name);
if (isFound) break;
A = Assembly.Load(An);
foreach (Type Typ in A.GetExportedTypes())
{
if (Typ.Name.ToUpper()==Name.ToUpper())
{
T= Typ;
isFound=true;
break;
}
}
}








Avatar
Chnew
Merci de votre réponse ...

J'avais ecrite cette fonction

public Type GetTypeFromAssembly(Assembly Ass,string TypeName)
{
if (Ass==null) return null;
foreach(Type Typ in Ass.GetTypes())
{
if (Typ.Name.ToUpper()==TypeName.ToUpper())
{
return Typ;
}
}
return null;
}



sinon comment charger une assembly dans le Appdomaine courant ?


"Simon Mourier [SoftFluent]" a écrit :

Il faut utiliser la fonction statique

Type.GetType(string typeName);

Car elle permet d'utiliser l''assembly qualified name', c'est à dire une
chaine qui contient le nom de la classe, virgule, le nom de l'assembly
(complet ou partiel)
Exemple:

"System.String, System"
"MonNamespace.MaClass, MonAssembly"
"System.Data.DataSet, System.Data, Version=2.0.0.0"
etc...

Evidemment, il faut que le .NET Framework arrive à trouver l'assembly tout
seul par son algorithme standard pour que cela fonctionne. Sinon il faut la
charger avant dans l'AppDomain.

Simon.
www.softfluent.com


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

> string = TcpChannel
>
> J'aimerai instancier un type d'objet TcpChannel
>
> je fais cela comme ceci
>
> Type TypeChannel = cod.GetTypeFromAllAssemblies(maChaineType):
> _Channel = Activator.CreateInstance(TypeChannel);
>
> J'ai bien ajouter ma reference system.runtinme.remoting sur mon client.
>
> ma fonction GetTypeFromAllAssemblies me retourne bien le type TcpChannel
>
> mais elle ne me le retourne que lorsque j'ai deja utiliser une instance de
> nimporte quel objet de cette Dll.
>
> Or le but pour moi etant dinstancier dynamiquement nimporte quel type
> d'objet sans me soucier à savoir si la Dll referencé a été chargée ou
> non...
>
> comment faire ?
>
>
>
> voici une partie de ma fonction
>
>
> Assembly A ;
> AssemblyName[] U;
> U=Assembly.GetCallingAssembly().GetReferencedAssemblies();
> foreach (AssemblyName An in U)
> {
> Console.WriteLine(An.Name);
> if (isFound) break;
> A = Assembly.Load(An);
> foreach (Type Typ in A.GetExportedTypes())
> {
> if (Typ.Name.ToUpper()==Name.ToUpper())
> {
> T= Typ;
> isFound=true;
> break;
> }
> }
> }
>
>
>
>
>
>





Avatar
Simon Mourier [SoftFluent]
Pour charger une assembly, ca a l'air simple, et ca peut être assez
compliqué.

En gros, il faut utiliser les fonction LoadXXX de la classe Assembly.

voir qq infos supplémentaires ici sur ce sujet:
http://blogs.msdn.com/junfeng/archive/2005/07/01/434580.aspx

Simon.
www.softfluent.com

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

Merci de votre réponse ...

J'avais ecrite cette fonction

public Type GetTypeFromAssembly(Assembly Ass,string TypeName)
{
if (Ass==null) return null;
foreach(Type Typ in Ass.GetTypes())
{
if (Typ.Name.ToUpper()==TypeName.ToUpper())
{
return Typ;
}
}
return null;
}



sinon comment charger une assembly dans le Appdomaine courant ?


"Simon Mourier [SoftFluent]" a écrit :

Il faut utiliser la fonction statique

Type.GetType(string typeName);

Car elle permet d'utiliser l''assembly qualified name', c'est à dire une
chaine qui contient le nom de la classe, virgule, le nom de l'assembly
(complet ou partiel)
Exemple:

"System.String, System"
"MonNamespace.MaClass, MonAssembly"
"System.Data.DataSet, System.Data, Version=2.0.0.0"
etc...

Evidemment, il faut que le .NET Framework arrive à trouver l'assembly
tout
seul par son algorithme standard pour que cela fonctionne. Sinon il faut
la
charger avant dans l'AppDomain.

Simon.
www.softfluent.com


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

> string = TcpChannel
>
> J'aimerai instancier un type d'objet TcpChannel
>
> je fais cela comme ceci
>
> Type TypeChannel = cod.GetTypeFromAllAssemblies(maChaineType):
> _Channel = Activator.CreateInstance(TypeChannel);
>
> J'ai bien ajouter ma reference system.runtinme.remoting sur mon client.
>
> ma fonction GetTypeFromAllAssemblies me retourne bien le type
> TcpChannel
>
> mais elle ne me le retourne que lorsque j'ai deja utiliser une instance
> de
> nimporte quel objet de cette Dll.
>
> Or le but pour moi etant dinstancier dynamiquement nimporte quel type
> d'objet sans me soucier à savoir si la Dll referencé a été chargée ou
> non...
>
> comment faire ?
>
>
>
> voici une partie de ma fonction
>
>
> Assembly A ;
> AssemblyName[] U;
> U=Assembly.GetCallingAssembly().GetReferencedAssemblies();
> foreach (AssemblyName An in U)
> {
> Console.WriteLine(An.Name);
> if (isFound) break;
> A = Assembly.Load(An);
> foreach (Type Typ in A.GetExportedTypes())
> {
> if (Typ.Name.ToUpper()==Name.ToUpper())
> {
> T= Typ;
> isFound=true;
> break;
> }
> }
> }
>
>
>
>
>
>