Mam rozwiązanie do studia wizualnego. W rozwiązaniu mam wiele projektów. Jest jeden główny projekt, który działa jako start-up i wykorzystuje inne projekty. Jest jeden projekt o nazwie „ProjectX”. Jego odniesienie zostało dodane do głównego projektu. ProjectX odwołuje się do innej biblioteki DLL .NET (powiedz abc.dll), która nie jest częścią rozwiązania.
Teraz ten plik abc.dll powinien zostać skopiowany do folderu bin / debugowania głównego projektu, ale nie jest tam kopiowany. Dlaczego nie można go skopiować, z jakichkolwiek znanych przyczyn?
RestoreProjectStyle
dostępne rozwiązanie . Chodzi o to, aby ustawić<RestoreProjectStyle>PackageReference</RestoreProjectStyle>
dla każdego projektu .Net Framework w rozwiązaniu.Odpowiedzi:
Odkryłem, że jeśli ProjectX odwoływał się do pliku abc.dll, ale nie używał bezpośrednio żadnego z typów DEFINED w abc.dll, to plik abc.dll NIE zostałby skopiowany do głównego folderu wyjściowego. (Zostałby skopiowany do folderu wyjściowego ProjectX, aby był bardzo mylący.)
Jeśli więc nie używasz żadnego z typów abc.dll w żadnym miejscu w ProjectX, umieść fałszywą deklarację gdzieś w jednym z plików w ProjectX.
Nie musisz tego robić dla każdej klasy - wystarczy jeden raz, aby skopiować plik DLL i wszystko działało zgodnie z oczekiwaniami.
Dodatek: Należy pamiętać, że może to działać w trybie debugowania, ale NIE w przypadku wydania. Szczegółowe informacje można znaleźć w odpowiedzi @ nvirth.
źródło
To tylko sidena na odpowiedź Overlorda Zurga.
W ten sposób dodałem referencyjne atrapę, która działała w trybie debugowania:
Ale w trybie Release zależna biblioteka DLL nadal nie została skopiowana.
Działa to jednak:
Ta informacja faktycznie kosztowała mnie wiele godzin, więc pomyślałem, że ją podzielę.
źródło
AbcDll.AnyClass
jest używany jako pole publiczne lub właściwość w klasie publicznej, wtedy będzie działać. Jeśli użyjesz go w treści metody takiej jak ta, kompilator go nie zobaczy . Opóźni to ładowanie tego zestawu, a nie tego, co chcesz się wydarzyć.Tak, musisz ustawić
Copy Local
natrue
. Jednak jestem całkiem pewny, będzie trzeba także odsyłającego wynika, że zespół od głównego projektu oraz zestawCopy Local
dotrue
jak dobrze - to nie tylko kopiowane z zestawu zależnego.Możesz dostać się do
Copy Local
nieruchomości klikając na zespół podReferences
i naciskając F4.źródło
Wygląda gładko, gdy stajesz się atrybutem zestawu
Wykorzystanie będzie:
źródło
Wpadłem na ten sam problem. Informacje podstawowe: przed budowaniem dodałem nowy projekt X do rozwiązania. Projekt Y zależał od Projektu X, a Projekt A, B, C zależał od Projektu Y.
Błędy kompilacji polegały na tym, że nie można było znaleźć bibliotek DLL projektu A, B, C, Y i X.
Główną przyczyną było to, że nowo utworzony Projekt X był ukierunkowany na .NET 4.5, podczas gdy pozostałe projekty rozwiązań były ukierunkowane na .NET 4.5.1. Projekt X nie został skompilowany, co spowodowało, że reszta Projektów również się nie zbudowała.
Upewnij się, że wszystkie nowo dodane projekty są kierowane na tę samą wersję .NET, co reszta rozwiązania.
źródło
Nie jestem pewien, czy to pomaga, ale dla mnie wiele razy odwołuje się do biblioteki DLL (która automatycznie dodaje ją do folderu bin). Jednak ta biblioteka DLL może wymagać dodatkowych bibliotek DLL (w zależności od używanych funkcji). NIE chcę odwoływać się do tych w moim projekcie, ponieważ muszą po prostu znaleźć się w tym samym folderze, co biblioteka DLL, której faktycznie używam.
Osiągam to w Visual Studio poprzez „Dodawanie istniejącego pliku”. Powinieneś być w stanie dodać go w dowolnym miejscu oprócz folderu Add_data. osobiście po prostu dodaję to do katalogu głównego.
Następnie zmień właściwości tego pliku na ...
Kompilacja działania = Brak (ustawienie tego na coś takiego jak Treść faktycznie kopiuje wersję „root” do katalogu głównego oraz kopię w Koszu).
Kopiuj do folderu wyjściowego = Kopiuj, jeśli nowszy (Zasadniczo umieszcza go w folderze BIN tylko wtedy, gdy go brakuje, ale nie robi tego później)
Kiedy publikuję ... moje dodane biblioteki DLL istnieją tylko w folderze BIN i nigdzie indziej w lokalizacji Publikuj (to jest to, czego chcę).
źródło
Możesz również sprawdzić, czy biblioteki DLL, których szukasz, nie są uwzględnione w GAC. Wierzę, że Visual Studio jest mądry, jeśli chodzi o nie kopiowanie tych plików, jeśli już istnieją w GAC na komputerze kompilacji.
Niedawno uruchomiłem się w tej sytuacji, w której testowałem pakiet SSIS, który potrzebował zespołów w GAC. Odtąd zapomniałem o tym i zastanawiałem się, dlaczego te biblioteki DLL nie wychodziły podczas kompilacji.
Aby sprawdzić, co jest w GAC (z wiersza polecenia Visual Studio Developer Developer):
Lub wyślij do pliku, aby ułatwić czytanie:
Aby usunąć zespół:
Powinienem również zauważyć, że po usunięciu plików z GAC były one poprawnie wyprowadzane do katalogu \ bin po kompilacji (nawet dla zestawów, które nie były bezpośrednio przywoływane w projekcie głównym). Było to w Visual Studio 2013 Update 5.
źródło
W moim przypadku była to najgłupsza rzecz, spowodowana domyślnym zachowaniem TFS / VS, z którym się nie zgadzam.
Ponieważ dodanie dll jako odwołania do głównego projektu nie zadziałało, postanowiłem dodać go jako „istniejący element”, z opcją Kopiuj lokalnie = Zawsze. Nawet wtedy pliku nie było.
Okazuje się, że pomimo tego, że plik jest obecny w VS Solution i wszystko skompilowane zarówno lokalnie, jak i na serwerze, VS / TFS nie dodał tak naprawdę dodania pliku do kontroli źródła. W ogóle nie został uwzględniony w „Oczekujących zmianach”. Musiałem ręcznie przejść do Eksploratora kontroli źródła i wyraźnie kliknąć ikonę „Dodaj elementy do folderu”.
Głupie, bo rozwijam się od 15 lat w VS. Natknąłem się na to wcześniej, po prostu nie pamiętałem i jakoś tęskniłem, ponieważ wszystko wciąż się kompilowało, ponieważ plik jest regularnym odniesieniem, ale plik, który został dodany jako istniejący element, nie był kopiowany, ponieważ nie istniał serwer kontroli źródła.
Mam nadzieję, że zaoszczędzi to komuś trochę czasu, ponieważ straciłem na to 2 dni życia.
źródło
gitignore
wzorca, więc podczas dodawania jako odniesienia nie dodała do projektu. MUSISZ ręcznie dodać plik do kontroli źródła !!!Jest to drobna poprawka na przykładzie nvirth
źródło
Dodałbym to do zdarzeń Postbuild, aby skopiować niezbędne biblioteki do katalogów wyjściowych. Coś takiego jak katalog ścieżek XCopy
Możesz je znaleźć we właściwościach projektu -> Kompiluj zdarzenia.
źródło
Kwestia:
Wystąpił podobny problem z biblioteką DLL pakietu NuGet (Newtonsoft.json.dll), w której dane wyjściowe kompilacji nie zawierają wspomnianej biblioteki DLL. Ale kompilacja idzie dobrze.
Naprawić:
Przejrzyj swoje projekty w edytorze tekstu i poszukaj odniesień z tagami. Jak prawda czy fałsz. „Prywatny” jest synonimem „Kopiuj lokalnie”. Gdzieś w akcjach MSBuild podejmuje się zlokalizowania zależności, znajduje swoją zależność gdzieś indziej i decyduje się jej nie kopiować.
Przejrzyj każdy plik .csproj / .vbproj i usuń tagi ręcznie. Przebuduj, a wszystko działa zarówno w Visual Studio, jak i MSBuild. Gdy już zaczniesz działać, możesz wrócić i zaktualizować miejsce, w którym Twoim zdaniem powinno być.
Odniesienie:
https://www.paraesthesia.com/archive/2008/02/13/what-to-do-if-copy-local-works-in-vs-but.aspx/
źródło
NIE JEST POTRZEBNA NA MANEKIN W KODIE
Po prostu:
lub / i upewnij się, że odniesienie w wykonywalnym projekcie zostało
"Copy Local"
ustawione naTRUE
(co było moją „ winą ”), wydaje się, że to „nadpisało” ustawienie w referencyjnym projekcie biblioteki ...źródło
Jeśli klikniesz prawym przyciskiem myszy odnośny zespół, zobaczysz właściwość o nazwie Kopiuj lokalnie . Jeśli opcja Kopiuj lokalnie ma wartość true, zespół powinien zostać dołączony do kosza. Jednak istnieją problemy ze Visual Studio, że czasami nie zawiera odnośnika dll w folderze bin ... jest to obejście, które działało dla mnie:
źródło
TLDR; Visual Studio 2019 może po prostu wymagać ponownego uruchomienia.
Sytuację tę spotkałem przy użyciu projektów opartych na projekcie Microsoft.NET.Sdk.
Konkretnie:
Project1
: cele.netstandard2.1
Microsoft.Extensions.Logging.Console
za pośrednictwem NugetProject2
: cele.netstandard2.1
Project1
poprzez referencje projektuProject2Tests
: cele.netcoreapp3.1
Project2
poprzez referencje projektuPodczas wykonywania testu otrzymałem komunikat o błędzie wskazujący, że
Microsoft.Extensions.Logging.Console
nie można go znaleźć, a tak naprawdę nie było w katalogu wyjściowym.Postanowiłem obejść ten problem, dodając
Microsoft.Extensions.Logging.Console
doProject2
, tylko po to , aby odkryć, że Nuget Manager programu Visual Studio nie wyświetlał sięMicrosoft.Extensions.Logging.Console
jako zainstalowanyProject1
, pomimo jego obecności wProject1.csproj
pliku.Proste zamknięcie i ponowne uruchomienie Visual Studio rozwiązało problem bez potrzeby dodawania dodatkowego odwołania. Być może pozwoli to zaoszczędzić komuś 45 minut utraconej produktywności :-)
źródło
Możesz ustawić zarówno główny projekt, jak i ścieżkę wyjściową kompilacji ProjectX do tego samego folderu, a następnie możesz pobrać wszystkie potrzebne biblioteki dll w tym folderze.
źródło
Upewnij się, że używana przez Ciebie zależna biblioteka DLL nie ma docelowej struktury .net wyższej niż docelowa struktura .net aplikacji twojego projektu.
Możesz to sprawdzić, wybierając projekt, a następnie naciśnij klawisze ALT + ENTER, następnie wybierz opcję Aplikacja z lewej strony, a następnie wybierz opcję Struktura docelowa projektu.
Załóżmy, że zależny dll Target Framework = 4.0 i Application dll Target Framework = 3.5, a następnie zmień to na 4.0
Dziękuję Ci!
źródło
Oprócz powyższych, miałem do opublikowania rozwiązanie obejmujące wiele projektów. Najwyraźniej niektóre pliki są ukierunkowane na różne frameworki.
Więc moje rozwiązanie: Właściwości> Określona wersja (Fałsz)
źródło
Dodaj bibliotekę DLL jako istniejący element do jednego z projektów i powinna zostać posortowana
źródło
VS2019 V16.6.3
Dla mnie problem polegał na tym, że główny plik .proj zakończył się takim wpisem dla projektu, którego biblioteka DLL nie była kopiowana do nadrzędnego folderu bin projektu:
Ręcznie usunąłem wiersz,
<Private>True</Private>
a następnie biblioteka DLL została skopiowana do głównego folderu bin projektu przy każdej kompilacji projektu głównego.Jeśli przejdziesz do odniesienia do projektu powodującego problem w folderze odniesienia głównego projektu, kliknij go i wyświetl właściwości, które zawierają ustawienie „Kopiuj lokalnie”. Znacznik prywatny odpowiada temu ustawieniu, ale dla mnie z jakiegoś powodu zmiana kopiowania lokalnego nie miała wpływu na prywatny znacznik w pliku .proj.
Irytujące nie zmieniłem lokalnej wartości kopii dla odniesienia, nie mam pojęcia, jak to się ustawiło, a kolejny dzień zmarnował śledzenie głupiego problemu z VS.
Dzięki wszystkim pozostałym odpowiedziom, które pomogły mi ustalić przyczynę.
HTH
źródło