2009-07-31 11 views
7

Utworzono aplikację konsolową przy użyciu C#, która odwołuje się do zewnętrznych bibliotek DLL. Gdy uruchomię go na moim komputerze, wszystko działa poprawnie. Na maszynie produkcyjnej pojawia się błąd "inicjowania typu". Patrząc na to, wygląda na to, że aplikacja może nie znaleźć odnośników DLL.W jaki sposób aplikacja konsoli .NET szuka zestawów referencyjnych?

W moim dev boxie odnośniki DLL znajdują się w GAC, ale nie w wersji produkcyjnej. Podczas usuwania bibliotek DLL z GAC w polu dev pojawia się ten sam błąd (chyba że uruchomię go z lokalnej wersji programu Visual Studio w trybie debugowania).

Jestem zaznajomiony z konfiguracją strony internetowej i wiem, że biblioteki DLL mogą zostać umieszczone w katalogu bin lub GAC, aby mogły zostać znalezione przez aplikację internetową. Ale nie jestem pewien, jak to działa w przypadku aplikacji konsolowych.

Nie chcę umieszczać biblioteki DLL w GAC w polu produkcyjnym, ponieważ jest ona potrzebna tylko w przypadku tej małej aplikacji. Czy mogę wdrożyć aplikację konsolową na inne sposoby, aby znalazła ona wymagane zestawy?

Oto wyjątek Dostaję:

Błąd 1 typu lub obszaru nazwę „Wejście” nie można znaleźć (jesteś brakuje using dyrektywa lub odwołania do zestawu?) C: \ dokumenty i Settings \ Hacker \ My Documents \ Visual Studio 2005 \ Projects \ podstawowy \ podstawowy \ Program.cs 10 8 podstawowy

Odpowiedz

11

Najprostszym rozwiązaniem jest umieszczenie DLL w tym samym katalogu co aplikacja Console i znajdzie je.

Dłuższa odpowiedź jest dość złożona, ponieważ istnieje wiele czynników, które wpływają na sposób i miejsce, w którym CLR szuka zestawów referencyjnych. Zachęcam do zapoznania się z poniższym artykułem z MSDN, który szczegółowo opisuje, jak to działa.

0

Podczas analizy wyjątku można dostać (i być może trzeba zanurzyć się w wewnętrznym wyjątku), powinieneś zobaczyć rejestr wszystkich miejscach przeszukania („dziennik fuzyjne”) .

Zalecam umieszczenie zależnych plików DLL w tym samym katalogu, co aplikacja konsoli.

+0

Właściwie po prostu musi wyświetlić 'ex.ToString()'. –

2

GAC (Global Assembly Cache) rejestruje pliki .dll, dzięki czemu nie trzeba ich przechowywać w katalogu roboczym aplikacji. Wszystkie pliki .dll systemu .NET (System.IO.dll, System.dll itp.) Są rejestrowane za pośrednictwem GAC, co oznacza, że ​​nie trzeba ich umieszczać w katalogu aplikacji. Domyślnie, jeśli .dll nie jest zarejestrowany w GAC, wtedy program będzie szukał w swoim własnym katalogu dla brakującego pliku .dll.

Tak, masz trzy możliwości:

  1. Dodaj swoją odwołuje .dll do GAC lub
  2. Dodaj swoją odwoływać.DLL do katalogu roboczym aplikacji
  3. przejdź do odesłania na rozwiązanie/projektu i wybierz Właściwości dla tego odniesienia, ustaw „CopyLocal = true” (zgłosił Partha powyżej tego)
3

 
- Right click on the assembly name in your project reference. 
- select Properties 
- In the properties window set CopyLocal to true 

+0

Och, zapomniałem wspomnieć o tym w mojej odpowiedzi. : P +1 – Zack

0

Możesz wdrażać biblioteki odnośników, gdzie chcesz. Musisz dodać App.config (dodaj/nowy element/plik konfiguracyjny aplikacji) do swojego podstawowego projektu i użyj sondowania tagów (konfiguracja/runtime/assemblybinding/probing), aby wskazać ścieżkę dla bibliotek dll.

Musisz skopiować bibliotekę DLL lub bibliotekę DLL do tej ścieżki i dodać do niej odniesienie w swoim projekcie. We właściwościach referencyjnych wpisz "copy local" na "false".

Powiązane problemy