2014-10-15 17 views
5

Mam zestaw całkowicie wypełniony klasami implementującymi interfejsy w innym złożeniu. Na przykład:Montaż jest zoptymalizowany z budowy

Main Assembly (Reference to both assemblies) 

Shared Assembly 
-----IModule 

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

Zestaw główny nie ma bezpośredniego odniesienia do żadnego z typów w zespole klasy. Szukam typów tak:

// 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... 

Jeśli mam odniesienie do tylko dowolnego typu w Zgromadzeniu klasy, to pojawia się w GetReferencedAssemblies, zostanie załadowany i wrócił poprawnie - ale jak tylko usuń odwołanie do typu, nie zostanie ono przesłane do katalogu budowania lub pojawi się jako zbiór odwołania, co spowoduje niepowodzenie ładowania.

Czy jest jakiś sposób zmusić VS do włączenia tego zestawu w katalogu wyjściowego? Główna aplikacja nie powinna mieć żadnej wiedzy na temat żadnego z typów w klasie.

+3

Pamiętam, że miałem podobny problem, a jedynym rozwiązaniem, jakie znalazłem, było dodanie fałszywego wywołania do referencyjnych zestawów w projekcie ... –

+0

@KevinD: Ponieważ główny zespół nie powinien wiedzieć, co się dzieje w klasy klasy, nie mogę realistycznie dodać fikcyjnego odwołania, chyba że założę, że typ w zespole klasy został stworzony specjalnie do tego celu. Problem polega na tym, że powyższy przykład jest zbyt uproszczony, co spowodowałoby niepotrzebne komplikacje i błoto w projekcie. – caesay

+1

Czy jest to kwestia specyficzna dla danego rozwiązania, czy też możesz podać kroki, aby ją odtworzyć w dowolnym kontekście? – Grx70

Odpowiedz

-1

Myślę, że dostaję twój problem, ale czy możesz wyjaśnić swoje pytanie? Czy oczekujesz zestawu, który dodałeś jako odniesienie do projektu, który chcesz skopiować do folderu wyjściowego za pomocą aplikacji? Jak dodać referencję? Czy jest to plik .dll czy .exe, który przeglądałeś w oknie dialogowym pliku, czy jest to zestaw COM lub GAC wybrany z listy w oknie dialogowym Dodaj odwołania?

Jeśli przeglądasz katalog i nie znajduje się on w katalogu GAC, oczekuje się tego rodzaju optymalizacji. Wybierz odniesienie w Eksploratorze rozwiązań i upewnij się, że "Kopiuj lokalnie" w oknie właściwości jest ustawione na true. Możesz spróbować zmienić to ustawienie, nawet jeśli jest. Twój plik .vsproj może po prostu zostać przebudowany, aby dołączyć referencję.

Jeśli próbujesz odwołać się do pliku .dll z nazwy pliku przechowywanej w łańcuchu lub zaznaczonej w środowisku wykonawczym, program Visual Studio nie będzie wiedział, że aplikacja go używa, niemniej jednak skopiować ją do pliku katalog wyjściowy. Jednak nie powinno to być zbyt trudne w File.Copy, jeśli masz ścieżkę .dll.

+0

Najwyraźniej ludzie, którzy skomentowali oryginalny post, lepiej rozumieją pytanie i udzielili lepszych odpowiedzi. Oczekuję złożenia, które jest dodawane jako zależność projektu (odwołanie), aby skopiować do katalogu wyjściowego, nawet jeśli nie ma bezpośredniego użycia kodu. Visual Studio zobaczy, że żadne typy nie są bezpośrednio używane i nie będzie kopiować odniesienia zespołu do katalogu wyjściowego. Pytanie brzmi, jak zapobiec temu optymalizowaniu. – caesay

+0

Ah, dzięki za wyjaśnienie. W twoim pytaniu nie było znaku zapytania, więc zdecydowałem, które z twoich wypowiedzi chcesz uzyskać odpowiedź. Czy próbowałeś już otworzyć plik .csproj w katalogu rozwiązań i sprawdzić zależności? Miałem podobne problemy z zasobami obrazu i ikon, które nie zostały uwzględnione w VS 2008, a rozwiązaniem było wówczas usunięcie linii, która nie pozwalała na odczytanie odnośnika, więc ustawienie Kopiuj lokalne nie było czytane. Z ciekawości, dlaczego chcesz dynamicznie odwoływać się do zespołu, a nie przez nazwę w kodzie? –