Как консольное приложение .NET выглядит для ссылочных сборок? - PullRequest
7 голосов
/ 31 июля 2009

Я создал консольное приложение с использованием C #, которое ссылается на внешние библиотеки DLL. Когда я запускаю его на своем компьютере разработчика, все работает нормально. На рабочей машине я получаю ошибку «инициализация типа». Глядя на это, кажется, что это возможно, потому что приложение не может найти ссылочные библиотеки DLL.

На моем компьютере разработчика указанные библиотеки DLL находятся в GAC, но не в рабочей. При удалении DLL из GAC в блоке dev возникает та же ошибка (если я не запускаю ее из локальной сборки Visual Studio в режиме отладки).

Я более знаком с настройками веб-сайта и знаю, что библиотеки DLL могут быть помещены в каталог bin или GAC, чтобы их можно было найти в веб-приложении. Но я не уверен, как это работает для консольных приложений.

Я неохотно помещаю DLL в GAC на рабочей коробке, так как она нужна только для этого небольшого приложения. Есть ли у меня другие способы развернуть консольное приложение и найти его необходимые сборки?

Вот исключение, которое я получаю:

Ошибка 1 Тип или имя пространства имен 'Entry' не найдено (вы отсутствует директива using или ссылка на сборку?) C: \ Documents and Настройки \ Хакер \ Мои документы \ Visual Studio 2005 \ Projects \ basic \ basic \ Program.cs 10 8 basic

Ответы [ 5 ]

11 голосов
/ 31 июля 2009

Самый простой ответ - поместить DLL в тот же каталог, что и консольное приложение, и он найдет их.

Более длинный ответ довольно сложен, так как существует множество факторов, которые влияют на то, как и где CLR ищет ссылки на сборки. Я рекомендую вам взглянуть на следующую статью MSDN, в которой подробно рассказывается, как это работает.

3 голосов
/ 31 июля 2009

- Right click on the assembly name in your project reference.
- select Properties
- In the properties window set CopyLocal to true
2 голосов
/ 31 июля 2009

GAC ( Global Assembly Cache ) регистрирует ваши .dll, поэтому вам не нужно, чтобы они были в рабочем каталоге вашего приложения. Все .NET-файлы .dll (System.IO.dll, System.dll и т. Д.) Регистрируются через GAC, что означает, что вам не нужно иметь их в каталоге вашего приложения. По умолчанию, если DLL-файл не зарегистрирован в GAC, программа будет искать в своем собственном каталоге отсутствующий DLL-файл.

Итак, у вас есть три варианта:

  1. Добавьте ваши .dll, на которые есть ссылки, в GAC, или
  2. Добавьте ваши .dll, на которые есть ссылки, в рабочий каталог вашего приложения
  3. Перейдите к своим ссылкам на решение / проект и выберите свойства для этой ссылки, установите «CopyLocal = true» (Кредит для Partha выше для этого)
0 голосов
/ 14 ноября 2009

Вы можете развернуть ссылочные библиотеки в любом месте. Вы должны добавить App.config (добавить / новый элемент / файл конфигурации приложения) в ваш базовый проект и использовать зондирование тегов (configuration / runtime / assemblybinding / probeing), чтобы указать путь для ваших библиотек.

Вы должны скопировать dll или dll на этот путь и добавить ссылку на них в свой проект. В свойствах ссылки поместите «copy local» в «false».

0 голосов
/ 31 июля 2009

Когда вы изучаете полученное исключение (и вам может потребоваться погрузиться во внутреннее исключение), вы должны увидеть журнал всех найденных местоположений («журнал объединения»).

Я бы порекомендовал просто разместить зависимые библиотеки DLL в том же каталоге, что и ваше консольное приложение.

...