Как едно .NET конзолно приложение търси референтни сборки?

Създадох конзолно приложение, използвайки C#, което препраща към външни DLL файлове. Когато го стартирам на моята машина за разработка, всичко работи добре. На производствената машина получавам грешка „иницииране на тип“. Разглеждайки това, изглежда може, защото приложението не може да намери посочените DLL файлове.

В моята кутия за разработка, посочените DLL файлове са в GAC, но не и в производствената. При премахване на DLL от GAC на кутията за разработка възниква същата грешка (освен ако не го стартирам от локална компилация на Visual Studio в режим на отстраняване на грешки).

По-запознат съм с настройките на уеб сайтове и знам, че DLL файловете могат да бъдат поставени в директорията bin или GAC, така че да могат да бъдат намерени от уеб приложението. Но не съм сигурен как работи това за конзолни приложения.

Не съм склонен да поставя DLL в GAC на производствената кутия, тъй като е необходим само за това едно малко приложение. Има ли други начини да разположа приложението на конзолата и то да намери необходимите модули?

Ето изключението, което получавам:

Грешка 1 Името на типа или пространството от имена „Entry“ не може да бъде намерено (липсва ли ви директива за използване или препратка към асемблиране?) C:\Documents and Settings\Hacker\My Documents\Visual Studio 2005\Projects\basic\basic\Program .cs 10 8 основен


person Community    schedule 31.07.2009    source източник


Отговори (5)


Най-простият отговор е да поставите DLL в същата директория като конзолното приложение и то ще ги намери.

По-дългият отговор е доста сложен, тъй като има много фактори, които влияят върху това как и къде CLR търси референтни сборки. Препоръчвам ви да разгледате следната статия от MSDN, която описва много подробно как работи това.

person JaredPar    schedule 31.07.2009
comment
Вашата връзка просто пренасочва към всички броеве на списание MSDN. Помните ли в кой брой беше? - person ; 29.07.2019

GAC (Global Assembly Cache) регистрира вашите .dll файлове, така че не е нужно да ги имате в работната директория на вашето приложение. Всички .dll на .NET (System.IO.dll, System.dll и т.н.) са регистрирани чрез GAC, което означава, че не е нужно да ги имате в директорията на вашето приложение. По подразбиране, ако .dll не е регистриран в GAC, тогава програмата ще търси в собствената си директория за липсващия .dll.

И така, имате три възможности за избор:

  1. Добавете посочените от вас .dll към GAC, или
  2. Добавете посочените от вас .dll към работната директория на вашето приложение
  3. Отидете до вашите референции за решението/проекта и изберете свойства за тази референция, задайте „CopyLocal = true“ (Кредит на Partha по-горе за това)
person Zack    schedule 31.07.2009

Когато прегледате изключението, което получавате (и може да се наложи да се потопите във вътрешното изключение), трябва да видите дневник на всички търсени местоположения („дневник за синтез“).

Бих препоръчал просто да поставите зависимите DLL файлове в същата директория като вашето конзолно приложение.

person Michael Petrotta    schedule 31.07.2009
comment
Всъщност той просто трябва да покаже ex.ToString(). - person John Saunders; 31.07.2009

Можете да разположите референтни dll файлове, където искате. Трябва да добавите App.config (добавяне/нов елемент/конфигурационен файл на приложение) към основния си проект и да използвате сондирането на етикета (configuration/runtime/assemblybinding/probing), за да посочите път за вашите dll.

Трябва да копирате dll или dll на този път и да добавите препратка към него във вашия проект. В референтните свойства поставете "copy local" на "false".

person Marco    schedule 13.11.2009

person    schedule
comment
О, забравих да го спомена в отговора си. :P +1 - person Zack; 31.07.2009