2011-01-04 8 views
2

Ich versuche, so etwas wie dies in meinem WPF-Anwendung zu tun:Wie fügen Sie Typen von externer Assembly zur Toolbox-Steuerung hinzu? (WPF)

ToolboxControl ctrl = new ToolboxControl(); 
    Assembly assembly = Assembly.LoadFile(file); 
    var category = new ToolboxCategory(assembly.GetName().Name); 
    foreach (Type t in assembly.GetTypes()) 
    { 
     var wrapper = new ToolboxItemWrapper(t, t.Name); 
     category.Add(wrapper); 
    } 
    ctrl.Categories.Add(category); 

heißt Zugabe ToolboxItemWrappers für jeden Typ in einer Baugruppe gefunden. Doch die letzte Zeile der folgende Ausnahme auslöst (siehe Bild)

http://img41.imageshack.us/img41/2261/7xvqv.png http://img41.imageshack.us/img41/2261/7xvqv.png

Alle Abhängigkeiten der externen Montage werden auch in der Haupt (WPF) Anwendung verwiesen. Also, was ist hier falsch und wie man es repariert?

Antwort

1

Ist die CustomLibrary-Assembly in der Datei? Ist dies nicht der Fall, hängen Sie dieses Ereignis in Ihrer App an AppDomain.CurrentDomain.AssemblyResolve an und laden Sie alle anderen Assemblys, auf die die Assembly im filePath verweist. Es ist erforderlich, wenn CustomLibrary oder andere DLLs nicht in GAC sind.

+0

Ja, es ist in der 'Datei' –

+0

Ich schlage vor, Sie haken zu dem AssemblyResolve-Ereignis und setzen Sie einen Haltepunkt. Sie wissen, auf was für alle Typen verwiesen wird und welche der Abhängigkeiten CLR nicht finden kann. –

+0

Sie haben Recht. Siehe auch [diese Antwort] (http://stackoverflow.com/questions/4600688/how-to-make-an-external-assembly-available-at-runtime) –

2

Sie verwenden Assembly.LoadFile, um die Baugruppe durch Reflexion zu laden. Diese Methode findet jedoch nicht automatisch Abhängigkeiten im selben Verzeichnis. Sie sollten Assembly.LoadFrom verwenden.

Beachten Sie auch, dass LoadFrom Fusion durchläuft, so dass die Ladeanforderung an eine andere Baugruppe umgeleitet werden kann, während LoadFile genau das lädt, was Sie angefordert haben.

+0

Vielen Dank für Ihre Antwort! Was ist Fusion? –

+0

Ich habe versucht, 'LoadFile' in' LoadFrom' zu ändern und es funktioniert immer noch nicht. –

+0

Fusion ist die Assembly Loader-Komponente der CLR. Angenommen, die Ausnahme, die bei der Anforderung von CustomLibrary durch Fusion ausgelöst wird, kann mithilfe von [Fusion log viewer] (http://msdn.microsoft.com/en-us/library/e74a18c4.aspx) überprüft werden, warum die Assembly nicht geladen werden kann. –

0

Stellen Sie sicher, dass "CustomLisbrary" in GAC installiert ist. Darüber hinaus möchten Sie möglicherweise design.dll und VisualStudio.design.dll erstellen.