14 Stimmen

Unity-Anwendungssperre 2.0 - Der angegebene Assembly-Name oder Codebase war ungültig

Schnittstellen (Im Assembly namens "Schnittstellen". Im Projekt: - Schnittstellen)

namespace Interfaces
{
    public interface IDoSomeWork1
    {
        string DoSomeWork1();
    }
}

namespace Interfaces
{
    public interface IDoSomeWork2
    {
        string DoSomeWork2();
    }
}

Abhängigkeiten (Im Assembly namens "Entitäten". Im Projekt: - Entitäten)

namespace Entities
{
    public class ClassB : IDoSomeWork1
    {
        public string DoSomeWork1()
        {
            return this.ToString();
        }
    }
}

namespace Entities
{
    public class ClassC : IDoSomeWork2
    {
        public string DoSomeWork2()
        {
            return this.ToString();
        }
    }
}

Klasse (Im Projekt: - UsingUnity)

public class ClassA
    {
        [Dependency]
        public IDoSomeWork1 DoSomeWork1 { get; set; }
        [Dependency]
        public IDoSomeWork2 DoSomeWork2 { get; set; }

        public void SomeMethodInClassA()
        {
            Console.WriteLine(DoSomeWork1.DoSomeWork1());
            Console.WriteLine(DoSomeWork2.DoSomeWork2());
        }
    }

App.Config (In einem Konsolenanwendungsprojekt: - ConsoleUsingUnity)

Der Client (In einem Konsolenanwendungsprojekt: - ConsoleUsingUnity)

public class Class1
    {
        static void Main(string[] args)
        {
            IUnityContainer container = new UnityContainer();

            // Aus der Konfigurationsdatei laden
            UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");
            section.Configure(container);

            ClassA classA = container.Resolve();
            classA.SomeMethodInClassA();
        }
    }

Und wenn ich den Client ausführe, erhalte ich den folgenden Fehler bei section.Configure(container);:-

Der angegebene Assemblyname oder der Codebase war ungültig. (Ausnahme von HRESULT: 0x80131047)

Ich bin mir nicht sicher, ob etwas mit der Konfiguration oder dem Typ falsch ist. Kann mir bitte jemand den Fehler hier aufzeigen?

20voto

drew_w Punkte 10122

Falls jemand anderes jemals das gleiche Problem hat - Ich hatte auch diesen Fehler, aber ich hatte ein etwas anderes Problem. Ich versuchte eine Assembly zu laden, die offensichtlich existierte, wie folgt:

Assembly.Load("C:\\Program Files\\MyProgram\\MyAssembly.dll");

Nach vielen Versuchen und Fehlern fand ich heraus, dass man den Pfad nicht übergeben soll und man sollte auf keinen Fall die .dll Erweiterung einschließen. Das Folgende hat mein Problem behoben:

Assembly.Load("MyAssembly");

Hoffentlich hilft das irgendjemand anderem früher oder später!

15voto

Ashish Gupta Punkte 14526

Bevor ich meine Frage beantworte, muss ich erwähnen, dass der oben gepostete Code mir kein Problem bereitet hat (Build-Fehler usw.). Er hat mir nur den Fehler gegeben, den ich in meiner Frage erwähnt habe. Das Problem mit Unity zu diesem Zeitpunkt ist, dass es nicht angibt, welche Assembly oder welche Typen in der Assembly nicht geladen werden konnten. Dies ist ein angefragtes Feature.

In meinem Fall war es ein Problem mit fehlender Assembly. Ich habe die Entities-Assembly nicht im Client-Anwendungsprojekt referenziert. Es scheint, dass die "Entities"-Assembly nur zur Laufzeit aufgelöst werden konnte (da sie mir keinen Kompilierungsfehler gegeben hat). Der Laufzeitfehler war jedoch auch nicht hilfreich.

Ich habe mir den Fusion Log Viewer angesehen (Er sollte im .NET SDK-Ordner sein). Was für ein nützliches Dienstprogramm es ist. Es kann alle Arten von Assembly-Bindungen protokollieren (alle oder nur Fehler) und es liefert eine sehr klare Beschreibung, welche Assembly nicht geladen werden konnte. Sehr hilfreich! FailedToLoadAssemblyDetected

Log

Also, das nächste Mal, wenn Sie diesen Fehler "Der angegebene Assembly-Name oder Codebase war ungültig" erhalten, versuchen Sie es mit dem Fusion Log Viewer. Er wird Ihnen nicht dabei helfen, herauszufinden, welche Typen nicht geladen werden konnten. Aber zumindest werden Sie sicher sein, dass alle Ihre Assemblys korrekt geladen werden.

6voto

PaulB Punkte 21834

Wenn Sie das Domain AssemblyResolve Ereignis verbinden, können Sie das Assembly erhalten, das nicht gebunden werden konnte.

 AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);

3voto

Mazrick Punkte 1129

Es gibt jetzt einen besseren Weg! Unity hat eine neue Version (aktuell 2.1.505.2), die die Details klar meldet und es Ihnen sofort ermöglicht, auf den Grund zu kommen.

Sie finden Binärdateien und Quellcode hier: http://unity.codeplex.com/releases

0voto

mdonatas Punkte 1759

Ich habe festgestellt, dass die zeitsparendste Methode, um herauszufinden, welcher Type genau nicht gebunden werden konnte, wie folgt ist:

  1. Gehen Sie zum Quellcode-Abschnitt der Unity-Seite unter Codeplex http://unity.codeplex.com/SourceControl/list/changesets
  2. Wählen Sie eine Version aus und laden Sie die Quellen herunter
  3. Erstellen Sie eine DEBUG-Version von Unity und Unity.Configuration (wenn Ihr Projekt mehr Unity-Assemblys verwendet, bauen Sie diese ebenfalls)
  4. Entfernen Sie Verweise auf Unity aus Ihrem Projekt und fügen Sie Verweise auf Assemblys aus Schritt 3 hinzu
  5. Wechseln Sie in Visual Studio zu Debug > Exceptions und stellen Sie sicher, dass Common Language Runtime Exceptions ein Kontrollkästchen in der Spalte Thrown hat.

Jetzt crashen Sie das Ding. Die Ausführung wird in der Methode TypeResolverImpl.SearchAssemblies von Unity gestoppt und der Parameter typeNameOrAlias wird die Antwort enthalten!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X