Charger dynamiquement une DLL à partir d'un dossier spécifique?
À l'instant, j'ai ce code :
var shellViewLibrary = Assembly.LoadFrom(Path.Combine(_DllsPath, _DllShellView));
IEnumerable<Type> types = shellViewLibrary.GetTypes();
foreach (Type type in types)
{
var typeIShellViewInterface = type.GetInterface(_NamespaceIShellView, false);
if (typeIShellViewInterface != null)
{
//here
}
}
Le truc, c'est que là où je suis //here
je veux utiliser Activator.CreateInstance
pour créer un objet dont le type est type
dans un dossier spécifique (qui est en dehors du dossier de création)
J'ai essayé d'environ 20 choses différentes, la plupart d'entre eux avec cette : http://msdn.microsoft.com/en-us/library/d133hta4.aspx
mais aucun ne fonctionne...
Le type que j'ai essayé est :
object MyObj = Activator.CreateInstance(shellViewLibrary.FullName, type.FullName);
ou
object MyObj = Activator.CreateInstance(Path.Combine(_DllsPath, _DllShellView), type.FullName);
J'ai toujours obtenu de différents exception, les plus courants étant :
XamlParseException
J'ai l'impression que je ne suis pas à l'aide de l'Activateur.CreateInstance dans le droit chemin avec 2 paramètres. Que dois-je faire ?
XamlParseException
se produit lorsqu'il y a eu une erreur avec l'analyse de XAML. Il devrait y avoir un intérieur d'exception, donc si vous déboguez autour de cette ligne, vous devez être en mesure de se plonger dans le XamlParseException
et de voir la source de celui-ci. Il sonne comme vous avez peut-être raté quelque chose que l' Assembly
de votre tentative de charge exige.Lorsque je passe mes arguments pour "Activateur.CreateInstance", j'ai eu le même message d'erreur donc j'ai vraiment envie de quelque chose qui est totalement faux :/
Je recommanderais d'emballage de votre Activateur.CreateInstance dans un try catch et débogage - au point d'exception interceptée regarder à l'intérieur des exceptions comme moi et Samuel Slade ont dit. En attendant la poursuite de code dans votre Q il ne semble pas que l'utilisation de l'Activateur ou d'Assemblage.La charge est le problème, mais plutôt une erreur dans un fichier Xaml utilisé par un contrôle instanciés par l'Activateur.CreateInstance
OriginalL'auteur Guillaume Slashy | 2012-01-19
Vous devez vous connecter pour publier un commentaire.
Une fois que vous appelez cette ligne
L'assemblée a été chargées dans la mémoire. Aussi longtemps que vous spécifiez les types correctement à partir de cela, alors vous serez en mesure d'utiliser l'Activateur.CreateInstance pour créer les types. c'est à dire: Il n'est pas nécessaire de préciser où le type est.
Concernant l'Activateur, de MSDN la méthode CreateInstance peut accepter un Système.Type. Je voudrais juste utiliser cette méthode à l'intérieur de votre si-déclaration:
Ce que je voudrais essayer de le faire pour déboguer c'est d'abord créer le type et ensuite de le transmettre à la méthode CreateInstance. Vous pouvez constater que le Type de la création elle-même est un échec (en raison de non résolus de l'assemblée) ou l'instanciation de ce type (en raison de l'exception dans le constructeur). Au premier coup d'œil ici votre code semble correct:
Dans votre question, vous spécifiez que vous êtes l'obtention d'un
XamlParseException
. Il me semble que le type en question est un UserControl (ou autre se réfère à un WPF Xaml fichier de ressources) et il y a une erreur dans ce fichier Xaml, c'est à dire rien à voir avec votre utilisation de l'Assemblage.De la charge ou de l'Activateur.CreateInstance.Pourriez-vous essayer de poster l'exception interne(s) pour avoir une meilleure idée sur le problème?
OriginalL'auteur Dr. ABT
Ceci est un exemple de "charger Dynamiquement une .dll à partir d'un Dossier Spécifique" au moment de l'exécution.
Ce qui m'a pris un certain temps à travailler, donc j'espère qu'il est de quelque utilité...
Il devrait vous donner une bonne indication de ce qui ne va pas si vous parcourez le code en mode de débogage. Vous avez également besoin de connaître le nom d'espace de Noms et le nom de la Classe, vous en invoquant l'aide de cette méthode. En outre, le code ci-dessus est de passer des paramètres à l' .dll. Si vous ne savez pas quels sont les paramètres à passer à la fonction appelée cela peut aussi être un problème...
OriginalL'auteur MoonKnight
Découvrez MEF et Prism. MEF est une injection de dépendance de la bibliothèque qui aide avec cela. Vous pouvez charger tous vos dépendances à partir d'un dossier spécifique et de faire charger dynamiquement.
Prism est un modèle qui tire parti de l'injection de dépendance et fonctionne très bien avec le MEF pour charger dynamiquement des librairies
OriginalL'auteur joe_coolish
si vous essayez de créer un type avec l'Activateur de classe à partir d'une DLL qui est en dehors de votre application, vous devez d'abord charger cette DLL à l'intérieur de votre domaine d'application.
La méthode la plus simple et la plus rapide façon de le faire est par l'utilisation de la de l'Assemblée.LoadFile méthode.
plus d'informations sur cette méthode peut être trouvé ici : http://msdn.microsoft.com/en-us/library/system.reflection.assembly.loadfile.aspx
Lorsque l'assemblée est correctement chargée, vous pouvez utiliser l'Activateur pour créer une instance du type à l'intérieur de la DLL.
Nous utilisons ce mécanicien d'exécuter du code personnalisé dans notre application.
LoadFile examine l'identité " de la DLL et valide les versions des assemblées alors que LoadFrom ne pas faire cela et juste attrape la version correspondante. LoadFile vous permet de charger les différentes versions des assemblées.
Si vous lisez le q. bien, vous verrez qu'il a déjà du type et de l'assemblée chargé
Il a ajouté qu'il n'était pas là à l'origine. Donc merci, mais j'ai lu la question
ok juste assez!
OriginalL'auteur codingbunny
Je ne suis pas sûr de ce que vous entendez par là:
Un type n'existe que dans une assemblée. Chemin est totalement hors de propos pour les types .NET
Je assumer que par "chemin" - vous vraiment dire "espace de noms", ce qui signifie que vous n'avez pas de savoir dans quel espace de noms de ce type existe. Vous avez déjà chargé l'assemblée dans votre code. Inspecter l'assemblage à l'aide de la réflexion pour trouver le type que vous recherchez. Passer ensuite le
Type
objet qui représente le type que vous cherchez àActivator.CreateInstance
Une fois que vous chargez l'assemblée, c'est dans la mémoire. Il y a des règles .NET a propos du chargement des assemblages à partir des disques distants (je misremember pour le moment, mais je vais les regarder), mais une fois que l'assemblée est chargé, de l'Activateur.CreateInstance va instancier types pour vous, à condition que vous lui dites de quel type que vous souhaitez instancier.
OriginalL'auteur Randolpho