Pytanie Zależności odniesień nie zostały skopiowane do katalogu wyjściowego


Mam bibliotekę CommonUtils, którą mam wbudowaną w bibliotekę dll, do której odwołuję się z kilku moich projektów. CommonUtils zależy od log4net.dll, który został ustawiony jako odniesienie do pliku i copy-local = true, gdy został zbudowany plik CommonUtils.dll. log4net.dll i CommonUtils.dll nie znajdują się w GAC.

Wszystko działa poprawnie w MyWorkingProject, gdzie mam tylko odniesienie do pliku CommonUtils.dll - log4net.dll pojawia się w katalogu wyjściowym (ponieważ jest to zależność od CommonUtils.dll, ale nie ma odniesienia do MyWorkingProject). Jednak jeśli utworzyć nowy projekt, aby dodać niektóre unittests: MyWorkingProjectTest i odniesienia projektu MyWorkingProject, a następnie plik odniesienia CommonUtils.dll ponownie tutaj (chcę użyć niektórych z CommonUtils), a następnie na budynku log4net.dll, który jest zależność zarówno w projekcie Odwołanie oraz w pliku odniesienia również nie zostanie skopiowane do katalogu wyjściowego.

Czy ktoś może wyjaśnić, co się tutaj dzieje? Czy kompilator nie wie, który z plików log4net.dll powinien pobrać? Czy jest tu coś, co robię źle? Czy powinienem to zrobić w jakiś inny sposób, aby plik log4net.dll został jawnie skopiowany? Czy ma to sens, że muszę jawnie odwoływać się do log4net?


18
2017-12-17 14:39


pochodzenie




Odpowiedzi:


Jest to zgodne z projektem. Musisz pomyśleć o konsekwencjach, które spowodowałoby automatyczne dziedziczenie referencji. Chociaż można logicznie zobaczyć, jakie odniesienia powinny być, nie ma takiego ograniczenia dla kompilatora. Teoretycznie może się zdarzyć, że powielimy framework i znaczną część systemu operacyjnego, jeśli przejdzie on przez całe drzewo zależności.

To zdecydowanie jest ból, zgadzam się i rozumiem twoją frustrację, ale zakładam, że Microsoft nie był w stanie znaleźć logicznego sposobu, by zrobić to inaczej.


2
2017-12-18 18:42



Czy możesz doradzić, jak powinienem to zrobić? Jeśli mam LibA i LibB, oba zależą od log4net i znajdują się w MyProjDir / LibA i MyProjDir / LibB, które zawierają log4net.dll. Którego log4net.dll powinieneś odwołać? Czy kopia-lokalna jest prawidłowa dla log4net.dll, nie jest to droga do budowania libA i libB? - Fadeproof
Osobiście dodaje wszelkie wspólne odniesienia do projektu najwyższego poziomu. Na przykład, jeśli obie biblioteki będą używane przez i aplikację, dodałbym log4net.dll bezpośrednio do folderu / bin aplikacji. To nie jest najlepsze rozwiązanie, ale uważam, że jest to łatwiejsze niż polowanie na referencje. - Joseph Ferris
"według i aplikacji" = "przez aplikację". Ponadto, mówiąc, że dodaję odniesienia do najwyższego poziomu, oszukuje. Nie dodaję odnośnika - po prostu dodaję do folderu / bin, ponieważ będzie on znajdował się w ścieżce sondowania dla bibliotek, które jej szukają. - Joseph Ferris
Ok Widzę, że mógłbym dodać zadanie sortowania postu, aby skopiować je jawnie zamiast budować moje CommonUtils z zestawem referencyjnym log4net, aby skopiować local = false? - Fadeproof


Wierzę, że jeśli nie dodasz log4net jako odnośnika w swoim projekcie, nie zostanie ono skopiowane.


1
2017-12-17 15:51



W jaki sposób dodać log4net jako odniesienie do projektu, ponieważ mam tylko rozproszone binarne biblioteki dll. Również dlaczego musiałbym dodać odniesienie do niego, ponieważ jest to po prostu zależność jednego z moich odniesień. Ktoś stwierdził, że nie powinieneś odwoływać się do bibliotek, których nie używasz jawnie w kodzie. - Fadeproof
Nie miałem na myśli "Referencji Projektu", a raczej "Referencji" w twoim projekcie. - user7116


Kiedy miałem podobną sytuację w przeszłości, otrzymałem ostrzeżenie kompilatora w Visual Studio mówiące, że muszę dodać odniesienie do biblioteki zależnej.

Czy otrzymujesz takie ostrzeżenie podczas kompilacji? Jeśli tak, postępuj zgodnie z udzieloną poradą i powinieneś znaleźć Log4net skopiowany do katalogu wyjściowego.


0
2017-12-18 00:21



Problem polega na tym, że mam dwa odnośniki, które mają zależności od log4net i wygląda na to, że w visual studio jest coś, co nie jest w stanie skopiować sprzecznej zależności (chociaż jest to ta sama). Wszystko działa zgodnie z oczekiwaniami, jeśli odwołuję się do 1, ale nie jest ono kopiowane, jeśli odwołuję się do obu. ? - Fadeproof
Czy oba odniesienia odnoszą się do tego samego zestawu? Sprawdź właściwości każdego odwołania, aby upewnić się, że ścieżka jest identyczna. - Bevan