2010-11-26 8 views
1

Ich habe eine Anwendung, die verwendet (hat referenziert) eine Klassenbibliothek (myLib.dll private Assembly).Unterscheiden Sie zwei gleiche private Assemblies

Ich erstellte ein neues Klassenbibliotheksprojekt mit genau dem gleichen Code der ersten Klassenbibliothek.

Wenn ich in einen Ordner die Anwendung und die zweite DLL legen, löst es eine Ausnahme, wenn ich es ausführen.

Wie unterscheidet die Anwendung die beiden Baugruppen, da sie nicht stark benannt sind?

dies ist die Anwendung

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

dies der Code jeder Bibliothek ist

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

Sie den junt in der Zeit debuger angezeigt wird. ("eine nicht behandelte Ausnahme aufgetreten")

+2

Was ist die Ausnahme? Und kannst du genau klären, was es verursacht, ich verstehe deine Beschreibung nicht. – Oded

Antwort

0

Wenn sich die Assembly nicht im GAC befindet, durchsucht die CLR die Verzeichnisse in den Suchpfaden nach einer ausführbaren Datei mit demselben Anzeigenamen. Was immer es findet, wird dann für die restlichen Assembly-Attribute AssemblyVersion, Culture und PublicKeyToken überprüft. Eine Nichtübereinstimmung mit der Referenzbaugruppe führt zu einer Ausnahme. Ich würde vermuten, dass die Assemblyversion nicht übereinstimmt, da culture normalerweise * ist und das Token des öffentlichen Schlüssels null ist.

Natürlich wird die Ausnahme Nachricht Ihnen eine bessere Diagnose als meine Antwort geben.

+0

Ich kann nicht verstehen, was ist der Unterschied zwischen den beiden ddls (außer nur die erste ist referenziert). Die Ausnahme lautet "Datei oder Assembly konnte nicht geladen werden" class1, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null 'oder eines seiner Abhängigkeiten. Die Manifestdefinition der lokalisierten Assembly stimmt nicht mit der Assemblyreferenz überein. (Ausnahme von HRESULT: 0x80131040) " –

+0

Was ist die Version der ursprünglichen Referenzbaugruppe? Fuslogvw.exe kann Ihnen zeigen, wonach es sucht und was es gefunden hat. –

+0

Sie hatten einen anderen Assemblynamen (Eigenschaftsmenü bei Visual Studio). –

0

Die Assemblys möglicherweise nicht signiert, aber sie haben immer noch ihre eigenen GUIDs. Assemblys werden primär durch ihre GUIDs im GAC und nicht durch ihre Dateinamen identifiziert.

Namensräume sind unterschiedlich. Wenn in Ihrem Projekt beide Assemblys referenziert sind und sie einen gemeinsamen Namespace verwenden, löst der Compiler eine Mehrdeutigkeitsausnahme aus, da er nicht ermitteln kann, welche Assembly Sie verwenden möchten.

+0

Was versuchen Sie zu tun? Erhalten Sie etwas, um Ihre kopierte Assembly anstelle der ursprünglichen Assembly zu verwenden? Versuchen Sie, Ihre eigene Logik zu injizieren? Auch was ich mit "teilen Sie einen gemeinsamen Namespace" gemeint ist, dass sie Namespaces sind die gleichen. Sie sollten nicht zwei Assemblys mit demselben Namespace und Klassennamen haben. Wenn Sie darauf bestehen, müssten Sie Ihre Klasse als eine partielle Klasse in BEIDE Baugruppen markieren. – bitxwise

+0

Ich wollte nur testen, wie eine Baugruppe referenziert wird. –

Verwandte Themen