Dlaczego nie mogę odwołać się do mojej biblioteki klas?

86

Mam rozwiązanie, które zawiera witrynę internetową i bibliotekę klas w programie Visual Studio 2008.

Następnie mam inny projekt witryny sieci Web poza rozwiązaniem, który musi odwoływać się do biblioteki klas. Klikam prawym przyciskiem myszy folder Bin lub projekt i wybieram opcję Dodaj odniesienie, a następnie wybieram mój projekt biblioteki klas, dodaje on około 15 bibliotek DLL, których potrzebuje biblioteka klas, do folderu bin witryn sieci Web, ale żaden z plików .cs nie rozpoznaje instrukcji using.

using MyLibrary.MyFolder;

Mówi, że nie może go rozwiązać, a ReSharper po prostu mówi, że można go bezpiecznie usunąć, ponieważ nie jest używany.

ReSharper może rozpoznać, że potrzebuje odwołania i sugeruje, że „odwołuje się do MyLibrary i używa MyFolder”. Nie jestem pewien, dlaczego sugeruje dodanie odniesienia, które już mam. Kiedy idę z sugestią, pojawia się błąd

„Nie udało się nawiązać połączenia z modułem. Prawdopodobnie odniesienie spowoduje cykliczne zależności między projektami”.

Próbowałem przejść do stron właściwości witryn internetowych i usunąć wszystkie odniesienia i ponownie je dodać, ale powoduje to te same błędy. Jakieś pomysły, dlaczego to nie działa?

Brandon
źródło
Sprawdź .net wersję ramowego w bibliotece klasy i projekt, który odwołują się
Manideep Innamuri

Odpowiedzi:

164

Sprawdź również, czy projekty nowego rozwiązania działają na platformie zgodnej z projektem, który próbujesz uwzględnić. Próbowałem zawrzeć odniesienie do projektu 4.0 w projekcie 3.5.

CindyH
źródło
3
Sława! Budowałem swoje rozwiązanie jako 4.5 i łączyłem je z 4.0. Ze względu na nasze obecne wymagania 4.0 obniżyłem nowe rozwiązanie do 4.0 i teraz mój drugi projekt nie ma problemów z budowaniem w porównaniu z nim. +1 za pomoc w zachowaniu rozsądku!
David Peterson
1
Pokonałem wiele wcześniejszych przeszkód w tym projekcie, miałem zamiar rzucić ręcznik, kiedy dostałem ten błąd. Uratowałeś to, dzięki!
Tony D
1
Nie spodziewałem się, że w ten sposób problem zostanie rozwiązany! Cool enuf
Irfaan
1
Następnie Microsoft powinien to powiedzieć i dołączyć opcję umieszczenia ich wszystkich w tej samej wersji.
PRMan
1
Uratowałem mój dzień! VisualStudio nawet nie zgłosiło alertu przypominającego mi o tym :(
Reuel Ribeiro
86

Znalazłem, jak rozwiązać ten problem (przynajmniej dla mnie). Dlaczego to zadziałało, nie jestem pewien, ale zadziałało. (Właśnie wypróbowałem na drugiej stronie internetowej, która miała ten sam problem i poniższe rozwiązanie również działało).

Próbowałem normalnego czyszczenia projektów i przebudowy, zamykając wszystkie moje wystąpienia Visual Studio i uruchamiając je ponownie, a nawet próbowałem ponownie uruchomić komputer.

W rzeczywistości zadziałało otwarcie projektu w programie Visual Studio, zamknięcie wszystkich otwartych kart, a następnie zamknięcie go.

Wcześniej zostawiłem otwarte karty, ponieważ nie sądziłem, że to ma znaczenie (i prawie nigdy nie zamykam kart, których używam).

Brandon
źródło
Po prostu ponowne uruchomienie VS zadziałało. Przyczyną tego problemu była zmiana nazwy projektu / przestrzeni nazw, która spowodowała błąd w języku R #.
mbx
Dla mnie to też zadziałało. Zamknąłem wszystkie karty, jak powiedziałeś, a następnie ponownie uruchomiłem moje IDE i voila, mogę teraz odwołać się do mojej biblioteki klas. Dziękuję Ci.
yuva
31

Jedną z możliwości jest to, że docelowa wersja biblioteki klas .NET Framework jest wyższa niż wersja projektu.

user4847434
źródło
8

Miałem podobny problem, czy wszystkie moje odniesienia zostaną błędnie usunięte przez Resharper - Rozwiązaniem, które zadziałało, jest wyczyszczenie pamięci podręcznej Resharper, a następnie ponowne uruchomienie VS

tools-> options-> resharper-> options-> general-> kliknij przycisk Clear cache i zrestartuj VS

Skalisty
źródło
4

Miałem podobne problemy, gdy VS czasami budował, a czasami nie. Po kilku poszukiwaniach i próbach odkryłem, że mam niejednoznaczne odniesienie do klasy o tej samej nazwie w różnych bibliotekach („FileManager”). Projekt, który nie zostałby skompilowany, to moje testy jednostkowe, które odwołują się do wszystkich modułów w moim rozwiązaniu. Wymuszenie odniesienia do określonego modułu rozwiązało problem.

Chodzi mi o to: zamiast winić ReSharper lub VS, dobrym pomysłem może być dwukrotne sprawdzenie, czy naprawdę nie ma jakiegoś cyklicznego odniesienia. Najczęściej klasy o tych samych nazwach w różnych modułach mogą powodować zamieszanie i często są objawem złego projektu (jak w moim przypadku).

Fedor Steeman
źródło
+1 w moim przypadku dwa projekty z różnymi przestrzeniami nazw zostały skompilowane do pliku .exe o tej samej nazwie (nazwa zestawu w zakładce Application w Visual Studio) - ze względu na projekt migracji ma to (trochę) sens; Msbuild z wiersza poleceń dał nam jeden nie tak pomocne wskazówki, które nam się zastanawiać przez chwilę: The type or namespace name 'A' does not exist in the namespace 'B'. Zauważ, że nie pojawiają się żadne ostrzeżenia ...
Jonno
3

To brzmi jak podobny problem z ReSharper:

http://www.jetbrains.net/devnet/thread/275827

Według jednego użytkownika w wątku wymuszenie kompilacji rozwiązuje problem (CTRL + Shift + B) po pierwszej kompilacji.

Brzmi jak problem z ReSharper, szczególnie w ich przypadku. Czy próbowałeś budować bez względu na ostrzeżenia i możliwe fałszywe błędy?

KP.
źródło
Natknąłem się na to wcześniej. I nie jestem pewien, czy zbudowanie go „rozwiązało” problem. Kompiluje, ale nadal pokazuje klasy, używając instrukcji, klas itp. Jako nierozpoznane. Jeśli jednak celowo zerwę wywołanie metody, program Visual Studio wydaje się rozpoznawać błąd, nawet jeśli nie wyświetla mi listy parametrów. Myślę, że to wina ReSharpers.
Brandon
3

Ponieważ oba znajdują się w tym samym rozwiązaniu, zamiast dodawać odwołanie do biblioteki DLL, dodaj odwołanie do samego projektu biblioteki klas (w oknie dialogowym Dodaj odwołanie będzie do tego odpowiednia karta).

Ach, to inne rozwiązanie. Przegapiłem to. Co powiesz na to, że zamiast dodawać odwołanie do projektu, możesz dodać odwołanie do skompilowanej biblioteki DLL biblioteki klas. W oknie dialogowym Dodaj odniesienie znajduje się karta Przeglądaj, która to robi.

Vilx-
źródło
1
To zadziałało dla mnie, inne rozwiązania sugerowały dodanie odniesienia, ale z jakiegoś powodu nie znalazłem go, dopóki nie kliknąłem głównego projektu prawym przyciskiem myszy w eksploratorze rozwiązań.
Ralpharama,
3

Po potwierdzeniu, że ta sama wersja asp.net była używana. Usunąłem projekt. wyczyściłem rozwiązanie i ponownie dodałem projekt. to działa dla mnie.

David
źródło
Miałem ten sam problem i wydawało się, że to pomogło. Dość dziwne.
inexcitus
2

Jeśli odwołujesz się do zestawów projektów, które znajdują się w tym samym rozwiązaniu, dodaj odwołanie do projektu (za pomocą karty „Projekty”), zamiast przeglądać dll w folderze \ bin \ Debug (lub \ bin \ Release) (używając Karta „Przeglądaj”). Zobacz zrzut ekranu poniżej. Przeglądaj tylko w poszukiwaniu pliku zestawu / dll, jeśli jest uważany za zestaw zewnętrzny.

wprowadź opis obrazu tutaj

MacGyver
źródło
2

Usunąłem * .csproj.user (plik resharper) z mojego projektu, a następnie zamknij wszystkie karty i otwórz go ponownie. Potem mogłem skompilować swój projekt i nie było żadnych ostrzeżeń o ponownym udostępnieniu.

Alex
źródło
Zrobiłem to i ponownie uzyskałem inteligencję pokazującą informacje o zestawie, ale gdy tylko spróbowałem ponownie skompilować, moje informacje Intelli-sense dla tego zestawu zostały wyczyszczone i kompilacja się nie powiodła. To jeden dziwny błąd!
David Peterson
Musiałem również odtworzyć mój projekt od zera ... myślę, że wykonałem kilka do wielu odinstalowań / instalacji w NuGet na stosunkowo świeżym projekcie.
Adam Nofsinger
Usuwanie i odtwarzanie odniesień działało dla mnie, pełne usuwanie pliku projektu może być przesadą.
danjuggler
2

Miałem ten problem. Zajęło mi to wieki, zanim to rozgryzłem. Miałem ludzi do pomocy przez ramię. Odbudowaliśmy, wyczyściliśmy i ponownie uruchomiliśmy Visual Studio i to nie rozwiązało problemu. Usunęliśmy i ponownie dodaliśmy odniesienia ...

Wszystko bez skutku ... Aż!

Rozwiązaniem mojego problemu było niepoprawne wpisanie deklaracji klasy.

Zanim zaczniesz surowo mnie oceniać, pozwól mi wyjaśnić, dlaczego nie było to głupie, a także dlaczego ten błąd mógł popełnić nawet najbardziej inteligentny z programistów.

Ponieważ błąd pojawił się na początku nazwy, nie pojawił się on na liście zajęć z inteligencją, kiedy zacząłem pisać.

na przykład

Nazwa klasy: Message.cs

Deklaracja:

public class Massage
{
    //code here

}

Na pierwszy rzut oka i małą czcionką Masaż wygląda identycznie jak Message.

Wpisanie M spowodowało wyświetlenie zbyt wielu klas, więc wpisałem e, które nie pojawiło się w błędnie wpisanej wersji, co sprawiało wrażenie, że klasa nie jest pobierana przez kompilator.

WonderWorker
źródło
Więc zasadniczo miałeś literówkę. To nie jest przydatne dla innych.
TylerH
0

Podobny problem miałem w VS 2010 podczas tworzenia projektu testowego dla aplikacji MVC 2. Objawy były identyczne.

Wiadomość od ReSharper była nieco myląca. Przez chwilę kompletnie zignorowałem ReSharper i zrobiłem to w „ręczny sposób VS”:

  1. Wyczyściłem roztwór.
  2. Ręcznie dodałem odniesienie do projektu MVC.
  3. Dodałem ręcznie dyrektywy using.
  4. ctrl-shift-b

Na tym etapie wystąpił błąd kompilacji: powinienem był odwołać się do pliku System.Web.Mvc zestawu w moim projekcie testowym (westchnienie). Dodanie tego odwołania powoduje kompilację projektu. Problemy z ReSharper pozostają, ale narzędzie do uruchamiania testów ReSharper działa.

Po ponownym uruchomieniu VS błędy ReSharper również zniknęły. Nie jestem pewien, czy ponowne uruchomienie jest wymagane - wystarczy zamknąć plik .cs.

Od teraz, kiedy zobaczę wiadomość ReSharper

Nie udało się nawiązać połączenia z modułem. Prawdopodobnie odniesienie spowoduje cykliczne zależności między projektami.

Przeczytam

Nie udało się nawiązać połączenia z modułem. Prawdopodobnie odniesienie spowoduje powstanie cyklicznych zależności między projektami lub brakuje niektórych odniesień do zależności zależności odniesienia.

Marijn
źródło
0

Kolejna możliwa poprawka, która właśnie zadziałała dla mnie:

Jeśli masz zestaw A, który odwołuje się do zestawu B, z których oba odwołują się do zestawu X spoza projektu (zewnętrznego), a kod zestawu B nie rozpozna, że ​​odwołujesz się do X, spróbuj wykonać następujące kroki w podanej kolejności:

  • Usuń odniesienie do X z OBU A i B
  • Odtwórz odniesienie do X w B
  • Odtwórz odniesienie do X w A

Najwyraźniej program VS nie rozpozna odwołania do zestawu zewnętrznego w projekcie, który jest zależnością innego projektu, który już odwołuje się do zewnętrznego. Poprzez ponowne skonfigurowanie odniesień od podstaw można to przezwyciężyć. To bardzo dziwne.

KeithS
źródło
Ciekawe, ale prawdziwe w VS2015. Dzięki!
Scott Nimrod,
0

Zmierzyłem się z tym problemem i rozwiązałem go, zamykając Visual Studio, ponownie otwierając Visual Studio, czyszcząc i przebudowując rozwiązanie. To zadziałało dla mnie.

Muhammad Sohail
źródło
0

W przypadku korzystania z TFS wykonanie polecenia Pobierz najnowsze (rekurencyjne) nie zawsze działa. Zamiast tego wymuszam pobranie najnowszej, klikając opcję Kontrola źródła => Pobierz określoną wersję, a następnie klikając oba pola. To zwykle działa.

wprowadź opis obrazu tutaj

Jeśli nadal nie działa, usunięcie pliku suo (zwykle znajdującego się w tym samym miejscu co rozwiązanie) zmusza program Visual Studio do pobrania wszystkich plików ze źródła (a następnie ponownego zbudowania pliku suo).

Jeśli to nie zadziała, spróbuj zamknąć wszystkie otwarte pliki i zamknąć program Visual Studio. Przy następnym uruchomieniu programu Visual Studio powinno to zostać naprawione. W ten sposób rozwiązano błąd resharpera.

WonderWorker
źródło
0

Niedawno natknąłem się na podobny problem. Pracuję w Visual Studio 2015 z Resharper Ultimate 2016.1.2. Próbowałem dodać nową klasę do mojej bazy kodu, próbując odwołać się do klasy z innego zestawu, ale Resharper zgłosiłby błąd dla tego pakietu.

Z pomocą współpracownika zorientowałem się, że klasa, do której się odwołujesz, istnieje w globalnej przestrzeni nazw i nie jest dostępna z nowej klasy, ponieważ została ukryta przez inną jednostkę o tej samej nazwie, która istniała w bieżącej przestrzeni nazw.

Dodanie słowa kluczowego „global ::” przed wymaganą przestrzenią nazw pomogło mi odwołać się do klasy, której faktycznie szukałem. Więcej informacji na ten temat można znaleźć na stronie podanej poniżej:

https://msdn.microsoft.com/en-us/library/c3ay4x3d.aspx

lumena
źródło
0

Jeśli oba projekty są zawarte w tym samym rozwiązaniu, bardziej odpowiednie będzie dodanie odwołania do projektu, którego potrzebujesz, a nie skompilowanej biblioteki dll.

wprowadź opis obrazu tutaj

Manuel Roldan
źródło
-1

Niestety jedyną rzeczą, która działała dla mnie, było całkowite usunięcie i odtworzenie projektu biblioteki klas, po tymczasowym skopiowaniu plików klas w innym miejscu. Dopiero wtedy projekt sieciowy ASP.Net rozpoznałby usinginstrukcje, które odnosiły się do projektu biblioteki klas. To było z Visual Studio 2010, bez ReSharper.

warknąć
źródło
-1

Miałem podobny problem. Pomogło mi to, że dodałem niewłaściwą bibliotekę klas ze studia wizualnego . Dodałem, korzystając z funkcji wyszukiwania w programie Visual Studio.

Musiałem dodać nowy projekt> Visual C #> Class Library . Ta nowo dodana biblioteka klas jest właściwa i można ją teraz dodać jako odniesienie do dowolnego projektu.

Muhammad Rehan Qadri
źródło
-4

Możesz zapomnieć o dodaniu odwołania do biblioteki klas, której potrzebujesz do zaimportowania.

Kliknij prawym przyciskiem myszy bibliotekę klas, do której chcesz importować (która zawiera wiele zaimportowanych bibliotek klas), -> Dodaj-> Odniesienie (Wybierz Projekty-> Rozwiązanie-> wybierz bibliotekę klas, z której chcesz importować-> OK)

Kyle
źródło