Instanciation dynamique d'instance de type par chaine de caractè re
3 réponses
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;
}
}
}
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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:
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; } } }
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:
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" <Chnew@discussions.microsoft.com> a écrit dans le message de news:
24908CB7-759F-488F-A58F-849D92613C4B@microsoft.com...
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;
}
}
}
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:
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; } } }
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:
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; > } > } > } > > > > > >
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:
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" <Chnew@discussions.microsoft.com> a écrit dans le message de news:
24908CB7-759F-488F-A58F-849D92613C4B@microsoft.com...
> 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;
> }
> }
> }
>
>
>
>
>
>
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:
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; > } > } > } > > > > > >
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:
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; > } > } > } > > > > > >
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" <Chnew@discussions.microsoft.com> a écrit dans le message de news:
50AA2E16-81DD-4496-8C46-7E183AEC4B9A@microsoft.com...
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:
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" <Chnew@discussions.microsoft.com> a écrit dans le message de
news:
24908CB7-759F-488F-A58F-849D92613C4B@microsoft.com...
> 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;
> }
> }
> }
>
>
>
>
>
>
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:
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; > } > } > } > > > > > >