2009-09-25 10 views
6

J'ai un assemblage réalisé dans un autre projet (projA). Maintenant, je veux importer cette DLL dans un autre projet (projB). Comment puis-je atteindre cet objectif? C'est ce que j'ai essayé (dans projB).ASP.NET Comment ajouter un assembly dans web.config?

1 Mettez dll dans le même répertoire que mon projet. (Le bac dir)

2 En web.config:

<assemblies> 
    <add assembly="projA, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> 
</assemblies> 

Ceci est l'erreur que je reçois:

Impossible de charger le fichier ou l'assembly « PROJA, Version = 1.0.0.0, Culture = neutre, PublicKeyToken = 31bf3856ad364e35 'ou l'une de ses dépendances. La définition de manifeste de l'assembly localisé ne correspond pas à la référence d'assembly. (Exception de HRESULT: 0x80131040)

EDIT:

Le point est que finalement la référence d'assemblage doit me ajouter dynamiquement

EDIT 2:

Le nom de l'ensemble (et l'espace) sont stocké dans la base de données. L'assembly physique (dll) est ajouté (par installation) dans projB. Maintenant, le code dans projB doit lire le nom de l'assembly à partir de la base de données, puis ajouter une référence à la DLL ajoutée par l'installation.

+0

Votre modification change radicalement la question à mon esprit. –

Répondre

7

Toutes les dépendances de projA sont-elles dans projB? Habituellement, j'ajoute simplement une référence d'un projet à un autre s'ils sont dans la même solution.

Edit:

Si vous souhaitez ajouter un ensemble dynamique alors peut-être une référence de service peut-être quelque chose à envisager. En vidant la DLL de projA dans la corbeille qui ne donne pas vraiment toutes les DLL dont elle a besoin, il existe des moyens de lier les choses afin que les objets puissent être compris à travers les systèmes, comme les services Web utilisant XML pour donner un exemple commun. Ma question sur l'ajout dynamique d'un assemblage est de savoir d'où vous l'obtiendriez et cette partie peut être automatisée pour faire partie de projB car c'est vraiment la solution générale à ce genre de problème.

Edit 2:

Comment pourriez-vous obtenir toutes les dépendances de PROJA? Est-il possible de l'obtenir pour que cela ne dépende pas d'un tas d'autres DLL qui peuvent ou ne peuvent pas être sur le système que cela doit exécuter. C'est ce que l'erreur vous dit, qu'il existe un projet d'assemblage qui est également requis. Notez que cet ajout d'assemblages peut continuer longtemps si plusieurs niveaux de dépendances sont utilisés.

Résumant la réponse: De quoi auriez-vous besoin pour référencer afin de charger projA dans un nouveau projet? C'est votre problème qui sans savoir à quoi ressemblent les dépendances est plutôt difficile à répondre directement.

+0

Le point est que finalement la référence d'assemblage doit m'a ajouté dynamiquement – Martijn

+0

Je suis désolé d'être si confus, j'ai édité mon poste. Espérons que cela le rendra plus clair – Martijn

4

Vous n'avez pas besoin d'ajouter quoi que ce soit dans Web.config si la DLL de l'assembly est dans le dossier Bin - vous n'avez besoin de le faire que si vous faites référence à un assembly qui se trouve dans le GAC. Le message d'erreur que vous obtenez indique essentiellement que l'assembly ne peut pas être trouvé dans le GAC, ce qui est probablement parce qu'il n'est pas là!

+1

Le chargeur d'assemblage recherchera d'abord dans le dossier local/bin, diverses autres combinaisons de noms/bin/et assembly, des dossiers de structure, etc. avant de passer au GAC. –

+0

Voir ma modification sur le poste de départ – Martijn

3

Vous n'avez pas besoin d'ajouter manuellement la référence dans le fichier web.config.Cliquez avec le bouton droit sur votre projet dans la fenêtre Explorateur de solutions dans Visual Studio et sélectionnez "Ajouter une référence". Accédez à l'onglet Parcourir et recherchez la DLL que vous avez créée dans l'autre projet, sélectionnez-la et cliquez sur OK. Vous pouvez éventuellement ajouter le projet A à la même solution que le projet B, puis ajouter la référence via l'onglet Projets de la fenêtre Ajouter une référence.

+0

Voir ma modification sur le poste de départ – Martijn

0

L'erreur

manifeste définition de l'Assemblée situé ne correspond pas à l'Assemblée référence.

suggère qu'une DLL a été trouvée mais ne correspondait pas à la version ou à la clé publique. Je suggère une double vérification pour garantir que la référence d'assembly correspond aux informations de version et qu'aucune DLL non valide avec les anciens numéros de version ne se trouve dans les chemins/bin ou le GAC

0

Eh bien, je suppose que dans une certaine mesure cela dépend de ce que vous avez l'intention de le faire une fois que vous avez chargé l'assemblage, et ce que vous avez dans l'assemblage. Je suppose que vous avez une sorte d'architecture de plugin, avec une interface connue ou une classe de base sur laquelle vous allez appeler des méthodes, disons IPlugin.

Quoi qu'il en soit, voici comment charger un ensemble dynamique, basé sur le stockage d'une référence dans soit une section de configuration ou d'une colonne DB quelque part:

private IPlugin LoadPlugin(string fullTypeName) { 
    Type type = Type.GetType(fullTypeName, false, true); 

    Object plugin = Activator.CreateInstance(type); 

    if (plugin is IPlugin) { 
    return (IPlugin) plugin; 
    } 

    // Handle the fact you've not got what you expected however you like 
    throw new ApplicationException(error); 
} 

Donc, cela prendra une chaîne telle que "projA.PluginClass, projA, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" charge la l'assemblage, et vous renvoie une instance de la classe que vous êtes intéressé par

alors vous l'utiliser comme ceci:.

// Call to DB to get details of class and assembly 
string pluginClass = GetPluginDetails(); 

IPlugin plugin = LoadPlugin(pluginClass); 

// Call known method to do something on IPlugin 
plugin.SomeMethod(); 
Questions connexes