2014-10-15 6 views
5

Ich habe eine Assembly vollständig mit Klassen gefüllt, die Schnittstellen in einer anderen Assembly implementieren. Zum Beispiel:Assembly wird von Build optimiert

Main Assembly (Reference to both assemblies) 

Shared Assembly 
-----IModule 

Class Assembly (Reference to shared assembly) 
-----unknownType : IModule 
-----unknownType2 : IModule 

Die Hauptbaugruppe hat keinen direkten Bezug auf einen der Typen in der Klassenbaugruppe. Ich suche nach der Art, wie so:

// Load all referenced assemblies: 
Assembly.GetExecutingAssembly().GetReferencedAssemblies() 
    .Except(AppDomain.CurrentDomain.GetAssemblies().Select(a => a.GetName())) 
    .Distinct() 
    .ToList() 
    .ForEach(act => Assembly.Load(act)); 

// Find all instances of IModule in loaded assemblies: 
var modules = from asm in AppDomain.CurrentDomain.GetAssemblies() 
    from provider in asm.GetTypes() 
    where typeof(IModule).IsAssignableFrom(provider) 
    ...instantiate type etc... 

Wenn ich einen Verweis auf nur eine beliebige Art in der Klasse Assembly habe, dann zeigt es in GetReferencedAssemblies up, werde geladen und wieder korrekt - aber sobald i Entfernen Sie den Verweis auf den Typ, es wird nicht in das Erstellungsverzeichnis übertragen oder als referenzierte Assembly angezeigt, die zum Fehlschlagen des Ladevorgangs führt.

Gibt es eine Möglichkeit, VS zu zwingen, diese Assembly in das Ausgabeverzeichnis aufzunehmen? Die Hauptanwendung sollte keinen der Typen innerhalb der Klassenassemblierung kennen.

+3

Ich erinnere mich, ein ähnliches Problem zu haben, und die einzige Lösung, die ich fand, war, einen Dummy - Aufruf zu den referenzierten Assemblys im Projekt hinzuzufügen ... –

+0

@KevinD: Da die Hauptbaugruppe nicht wissen soll, was in der class assembly, kann ich keinen Dummy-Verweis realistisch hinzufügen, es sei denn, dass ein Typ in der Klassenassemblierung speziell für diesen Zweck erstellt wird. Das Problem besteht darin, dass das Beispiel hier vereinfacht dargestellt ist, und dies würde dem Design unnötige Komplikationen und Schmutz hinzufügen. – caesay

+1

Ist dies ein lösungsspezifisches Problem oder können Sie Schritte zur Reproduktion in einem beliebigen Kontext bereitstellen? – Grx70

Antwort

-1

Ich denke, ich bekomme dein Problem, aber kannst du deine Frage klären? Erwarten Sie eine Assembly, die Sie als Referenz zu Ihrem Projekt hinzugefügt haben, um mit Ihrer Anwendung in den Ausgabeordner kopiert zu werden? Wie haben Sie die Referenz hinzugefügt? Ist es eine DLL- oder EXE-Datei, zu der Sie in einem Dateidialogfeld geblättert haben, oder handelt es sich um eine COM- oder GAC-Baugruppe, die Sie aus einer Liste im Dialogfeld "Referenzen hinzufügen" ausgewählt haben?

Wenn Sie zu ihm geblättert haben, und es ist nicht im GAC-Verzeichnis, wird diese Art der Optimierung erwartet. Wählen Sie Ihre Referenz im Projektmappen-Explorer aus, und stellen Sie sicher, dass "Kopie lokal" im Eigenschaftsfenster auf "Wahr" gesetzt ist. Sie könnten versuchen, diese Einstellung zu ändern, selbst wenn dies der Fall ist. Ihre .vsproj-Datei muss möglicherweise nur neu erstellt werden, um die Referenz aufzunehmen.

Wenn Sie versuchen, eine .dll aus einem in einer Zeichenfolge gespeicherten oder zur Laufzeit ausgewählten Dateinamen abzurufen, kann Visual Studio nicht wissen, dass Ihre Anwendung es verwendet, und trotzdem in Ihre Ausgabe Verzeichnis. Es sollte nicht so schwer sein, dies mit File.Copy zu tun, wenn Sie den Pfad der .dll haben.

+0

Offensichtlich haben die Leute, die den ursprünglichen Beitrag kommentiert haben, die Frage besser verstanden und bessere Antworten geliefert. Ich erwarte eine Assembly, die als Projektabhängigkeit (Referenz) hinzugefügt wird, um in das Ausgabeverzeichnis kopiert zu werden, auch wenn der Code nicht direkt verwendet wird. Visual Studio erkennt, dass keine Typen direkt verwendet werden und kopiert die referenzierte Assembly nicht in das Ausgabeverzeichnis. Die Frage ist, wie dieses Optimierungsverhalten verhindert werden kann. – caesay

+0

Ah, danke für die Klärung. Es gab kein Fragezeichen in Ihrer Frage, also habe ich einen Stich gemacht, auf welche Ihrer Aussagen Sie eine Antwort haben wollten. Haben Sie versucht, die .csproj-Datei im Lösungsverzeichnis zu öffnen und dort die Abhängigkeiten zu überprüfen? Ich hatte ähnliche Probleme mit Image- und Icon-Ressourcen, die nicht in VS 2008 enthalten waren, und die Lösung bestand darin, eine Zeile zu entfernen, die explizit verhinderte, dass die Referenz gelesen wurde, sodass die Einstellung Lokale Kopie nicht gelesen wurde. Aus Neugier, warum möchten Sie die Assembly nur dynamisch und nicht namentlich im Code referenzieren? –

Verwandte Themen