Chargement des assemblages lors de l'exécution et de la création d'instances à l'aide de l'Activateur.CreateInstance()
Je suis en train de charger un assembly à l'exécution, et je ne suis pas sûr pourquoi je ne peux pas créer une instance d'un type à l'assemblée à l'aide de la statique Activator.CreateInstance()
. Il fonctionne avec Assembly.CreateInstance()
.
string assemblyFilename = "MyAssembly.dll";
string assemblyName = "MyAssembly";
string typeName = "MyAssembly.MyType";
FileInfo fileInfo = new FileInfo(assemblyFilename);
Cela fonctionne:
var assembly = Assembly.LoadFrom(assemblyFilename);
Form form = (Form)assembly.CreateInstance(typeName);
Mais cela ne fonctionne PAS:
Assembly.LoadFrom(assemblyFilename);
Form form = (Form)Activator.CreateInstance(assemblyName, typeName).Unwrap();
FileNotFoundException jeté:
Impossible de charger le fichier ou l'assembly 'MyAssembly' ou une de ses
les dépendances. Le système ne peut pas trouver le fichier spécifié.
EDIT:
Dans les deux cas, après la Assembly.LoadFrom()
appel, je peux voir que mon montage a été chargé quand je me regarde dans AppDomain.CurrentDomain.GetAssemblies()
.
La 2ème version qui devrait spécifier un assemblage complet de nom, pas seulement le nom d'affichage, et les utilisations de l'Assemblée.Load() sous le capot. Pas la même chose que LoadFrom(). La résolution de problèmes avec fuslogvw.exe
Comme dans "MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=5dc3e20777fed081"? Je reçois la même erreur
J'ai même copié le FullName directement à partir de "MyAssembly" dans GetAssemblies() et ça ne fonctionne toujours pas. Tellement confus!
Une chose de plus, essayez de brancher dans l'événement AssemblyResolve de domaine d'application.Actuel. Il doit se déclencher lorsque l'assemblée n'est pas trouvé, peut-être vous pouvez voir l'intégralité de l'assemblée de nom, il est à la recherche pour. Peut-être qu'il ne peut pas trouver une dépendance que votre MyAssembly utilise.
Une autre chose Dave, essayez d'utiliser de l'assemblée pour le nom qualifié du nom de type, c'est à dire: TopNamespace.SubNameSpace.ContainingClass+NestedClass, MyAssembly, Version=1.3.0.0, Culture=neutral, PublicKeyToken=b17a5c561934e089
Comme dans "MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=5dc3e20777fed081"? Je reçois la même erreur
J'ai même copié le FullName directement à partir de "MyAssembly" dans GetAssemblies() et ça ne fonctionne toujours pas. Tellement confus!
Une chose de plus, essayez de brancher dans l'événement AssemblyResolve de domaine d'application.Actuel. Il doit se déclencher lorsque l'assemblée n'est pas trouvé, peut-être vous pouvez voir l'intégralité de l'assemblée de nom, il est à la recherche pour. Peut-être qu'il ne peut pas trouver une dépendance que votre MyAssembly utilise.
Une autre chose Dave, essayez d'utiliser de l'assemblée pour le nom qualifié du nom de type, c'est à dire: TopNamespace.SubNameSpace.ContainingClass+NestedClass, MyAssembly, Version=1.3.0.0, Culture=neutral, PublicKeyToken=b17a5c561934e089
OriginalL'auteur davenewza | 2012-09-07
Vous devez vous connecter pour publier un commentaire.
Vous devez d'abord charger l'assembly dans votre domaine d'application:
EDIT: cela fonctionne?
AppDomain.CurrentDomain.GetAssemblies()
aprèsAssembly.LoadFrom()
ensuite, je peux voir mon montage a été chargé dans les deux cas.Vérifier mon montage pour voir si cela fonctionne
Il n'a pas. J'ai "la Valeur ne peut pas être null" sur
Type.GetType()
.Type.GetType(typeName) retourne la valeur null ou le nom lui-même est nulle?
Comment à propos de l'utilisation domaine d'application.Actuel.CreateInstance(assemblyName, typeName)?
OriginalL'auteur armen.shimoon
Vous pouvez régler votre fichier avec son chemin d'accès
j'ai ajouté le code pour l'afficher
OriginalL'auteur Aghilas Yakoub
Essayé de modifier l'original de réponse, mais je n'ai obtenu aucune réponse de l'auteur. Donc, juste au cas où quelqu'un a besoin de cela, voici le code qui a fonctionné pour moi
OriginalL'auteur A Khudairy
Une variation de Un Khudairy de réponse ici pour permettre la transmission de paramètres d'entrée pour accéder à un spécifique constructeur, en plus de cette variation de sa réponse résolu un problème que j'ai eu et littéralement été à la recherche sur et en dehors depuis plusieurs semaines maintenant essayer de résoudre (merci à lui pour le partage de la réponse).
Mon problème était que je voulais charger un .NET 3.5 dll dans une nouvelle application qui a été .NET de 4,6, mais ces vieux dll tiers des contrôles qui semblait CAS d'utilisation de la politique. J'aimerais obtenir une erreur de la troisième partie des contrôles disant que j'avais besoin de tourner dans l'application.config, si je n'ai que je pouvais charger et d'exécuter des fichiers il suffit de bien s'ils étaient sur mon ordinateur local, mais si j'ai essayé de les charger à partir d'un lecteur réseau, j'ai besoin de le faire, puis j'ai eu un FileIOPermission erreur.
Essayé de courir combinaisons de NetFx40_LegacySecurityPolicy avec loadFromRemoteSources et useLegacyV2RuntimeActivationPolicy, et j'ai essayé plusieurs différentes méthodes telles que l'Activateur.CreateInstance() qui travaille habituellement pour moi, essayé de créer un bac à sable (même si je ne sais pas si je l'ai fait correctement), mais rien n'aurait, à l'exception ci-dessous. Remarque, mon utilisateur des contrôles ont également été basé sur une classe de base. J'ai eu exécuter certains CAS de commande d'invite de commandes avant d'accorder l'accès au lecteur réseau, et mon application doit être en cours d'exécution en pleine confiance. Peu importe, il ne ressemble pas à toutes les méthodes que j'avais essayé d'autres que celui-ci a travaillé jusqu'à présent pour moi.
Le code corrigé:
... à partir de laquelle je pourrais plus tard convertir l'objet en tant que de besoin (pour ma classe de base), au plus tard le lancer dans sa propre Forme/Fenêtre.
OriginalL'auteur DeltaPng