07/08/2011

Kłopoty z Client Profile

Home

The type or namespace name 'SomeType' does not exist in the namespace 'SomeNamespace' (are you missing an assembly reference?)

Sądzę, że każdy programista .NET spotkał się z powyższym błędem kompilacji. Nie jest to nic wyjątkowego i rozwiązanie problemu jest bardzo łatwe, wystarczy dodać do projektu referencję do brakującej biblioteki. Czy oby na pewno?

Kilka dni temu napotkałem powyższym błąd kompilatora i rozwiązanie problemu zajęło mi sporo więcej czasu niż normalne kilkanaście sekund. Na początku zdziwiłem się ponieważ niekompilujący się projekt aplikacji zawierał potrzebną referencję, kilka minut wcześniej sam ją dodałem. Na wszelki wypadek podpiąłem ją jednak jeszcze raz i przekompilowałem wszystkie potrzebne projekty ale nic to nie dało. Restart Visual Studio również nie pomógł. Kilka kolejnych prób kompilacji również spełzło na niczym.

Trochę zrezygnowany zabrałem się do przeglądania ustawień felernego projektu i zwróciłem uwagę na to, że korzysta on .NET Framework 4 Client Profile. Wcześniej nie miałem z tym problemu ale przypomniałem sobie, że w projektach tego typu nie można korzystać z bibliotek, których nie ma w NET Framework 4 Client Profile. Na próbę zmieniłem opcję Target framework na .NET Framework 4 i okazało się to strzałem w dziesiątkę.

W ramach testu zacząłem zmieniać różnym projektom opcję Target framework na .NET Framework 4 Client Profile i sprawdzać czy się kompilują. Okazało się, że prawie wszystkie skompilowały się bez żadnego problemu. Dalsze eksperymenty doprowadziły mnie do następującego wniosku:

Błąd zostanie zgłoszony jeśli w projekcie korzystającym z NET Framework 4 Client Profile użyjemy biblioteki, która bezpośrednio lub pośrednio korzysta z czegoś co nie znajduje się w NET Framework 4 Client Profile.

Przez użyjemy rozumiem np.: stworzenie instancji klasy. Samo dodanie referencji do biblioteki czy nawet zaimportowanie przestrzeni nazw przy pomocy using nie spowoduje błędu. Ważne jest również to, że biblioteka powodująca błąd może znajdować się gdzieś daleko w łańcuchu referencji, co jeszcze utrudnia sprawę. Należy również wiedzieć, że o przynależności lub nie do NET Framework 4 Client Profile nie decydują opcje kompilacji ale to z czego korzystamy w danej bibliotece. Listę "zabronionych" rzeczy można znaleźć tutaj. W moim przypadku błąd powodowała "zabroniona" biblioteka System.Data.OracleClient, z której korzysta Microsoft.Practices.EnterpriseLibrary.Data.dll, którą z kolei używam ja.

Sądzę, że warto o tym pamiętać aby zaoszczędzić sobie nerwów szczególnie, że kiedy dodajemy nowy projekt aplikacji (WPF, WinForms, konsola) to domyślnie będzie on korzystał .NET Framework 4 Client Profile. W większości przypadków jest to dla nas przezroczyste ale zawsze może trafić się ten jeden raz.

3 comments:

Anonymous said...

Pamiętasz, pierwszy raz jak napotkałem na ten problem przy dodaniu log4net'a na ustach miałem tylko wtf?! ;)
Moim zdaniem przy wystąpieniu tego problemu, powinniśmy jakiś lepszy komunikat błędu dostać, bo ten za dużo przynajmniej mi nie wyjaśnił.

Anonymous said...

Niestety mam podobyn problem w projekcie XNA, niestety tam nie można ustawić client profile dla Windows Phone 7 :/ i bilbioteka mimo że podpięta tom nie śmiga.

Anonymous said...

Wielkie dzięki, bardzo mi to pomogło.

Post a comment