2010-11-26 9 views
1

J'ai une application qui utilise (a référencé) une bibliothèque de classes (assembly privé myLib.dll).Distinguer deux mêmes assemblées privées

J'ai créé un nouveau projet de bibliothèque de classes avec exactement le même code que la bibliothèque de première classe.

Lorsque je mets dans un dossier l'application et la deuxième DLL il lève une exception quand je l'exécute.

Comment l'application distingue-t-elle les deux assemblées puisqu'elles ne sont pas nommées de manière forte?

c'est l'application

class Program 
{ 
    static void Main(string[] args) 
    { 
     try 
     { 
      mYnameSpace.Class1 c = new mYnameSpace.Class1(); 
      c.test1(); 
      Console.ReadLine(); 
     } 
     catch(Exception ex) 
     { 
      Console.WriteLine(ex); 
     } 
    } 
} 

c'est le code de chaque bibliothèque

namespace mYnameSpace 
{ 
    public class Class1 
    { 
    public void test1() 
    { 
     Console.WriteLine("hello"); 
    } 
    } 
} 

Il est affiché le junt en debuger temps. ("une exception non gérée s'est produite")

+2

Quelle est l'exception? Et pouvez-vous préciser exactement ce qui le cause, je ne comprends pas votre description. – Oded

Répondre

0

Si l'assembly n'est pas dans le GAC, le CLR recherche dans les répertoires dans les chemins de vérification un exécutable portant le même nom d'affichage. Lequel trouve toujours est alors vérifié pour le reste des attributs d'assembly, AssemblyVersion, Culture et PublicKeyToken. Une discordance avec l'ensemble de référence produit une exception. Je devinerais à une incompatibilité de version d'assemblée puisque la culture est normalement * et le jeton de clé publique est nul.

Bien sûr, le message d'exception vous donnera un meilleur diagnostic que ma réponse.

+0

Je ne comprends pas quelle est la différence entre les deux ddls (sauf le premier est référencé). L'exception est "Impossible de charger le fichier ou l'assembly 'class1, Version = 1.0.0.0, Culture = neutre, PublicKeyToken = null" ou l'une de ses dépendances.La définition du manifeste de l'assembly localisé ne correspond pas à la référence d'assembly. 0x80131040) " –

+0

Quelle est la version de l'assembly de référence d'origine? Fuslogvw.exe peut vous montrer ce qu'il cherche et ce qu'il a trouvé. –

+0

Ils avaient un nom d'assemblage différent (menu des propriétés de Visual Studio). –

0

Les assemblys ne peuvent pas être signés, mais ils ont toujours leurs propres GUID. Les assemblys sont principalement identifiés par leurs GUID dans le GAC et non par leurs noms de fichiers.

Les espaces de noms sont différents. Si vous avez les deux assemblys référencés dans votre projet et qu'ils partagent un espace de noms commun, le compilateur lèvera une exception d'ambiguïté car il ne peut pas déterminer l'assembly que vous essayez d'utiliser.

+0

Qu'est-ce que vous essayez de faire? Obtenez quelque chose pour utiliser votre assemblage copié au lieu de l'assemblage d'origine? Essayez-vous d'injecter votre propre logique? En outre, ce que je voulais dire par "partager un espace de noms commun", c'est que leurs espaces de noms sont les mêmes. Vous ne devriez pas avoir 2 assemblées avec le même espace de nom et le même nom de classe. Si vous insistez pour le faire, vous devrez marquer votre classe comme une classe partielle dans les deux assemblées. – bitxwise

+0

Je voulais juste tester comment est référencé un assemblage. –

Questions connexes