C # не может найти библиотеку во время выполнения - PullRequest
1 голос
/ 10 марта 2009

У меня есть проект C #, который использует DLL. Я добавил dll к ссылкам проекта и установил свойство Copy Local в False (я не хочу иметь локальные копии этой dll).

Компиляция выглядит нормально, но когда я пытаюсь запустить приложение C #, он не может найти DLL.

Где я могу указать проекту, где искать библиотеку во время выполнения?

Спасибо

Ответы [ 8 ]

3 голосов
/ 10 марта 2009

Взгляните на эту статью MSDN. Речь идет об элементе .

Определяет базу приложения подкаталоги для общего языка время выполнения для поиска при загрузке сборки.

Это позволяет указать приложению, где оно может искать сборки, отличные от папки / bin по умолчанию.
Обратите внимание, что он ищет «подкаталоги», поэтому он не может быть совершенно другой папкой. Он должен находиться в базовой папке вашего приложения.

1 голос
/ 10 марта 2009

Почему вы устанавливаете copylocal в false для ссылок на проекты? Делать это не рекомендуется.

Смотрите разницу между:

  1. Разрешение сборки во время компиляции
  2. Разрешение сборки во время выполнения

Сборки GAC всегда разрешаются во время выполнения. Сборки GAC являются общими сборками по умолчанию (с учетом повторного использования).

Разрешение времени компиляции используется для завершения сборки. Используйте как можно больше ссылок на проекты (со сборками в вашем решении). Используйте ссылки на файлы, когда вы не отвечаете за сборку тех сборок, которые хотите использовать, и эти сборки не включены в ваше решение.

1 голос
/ 10 марта 2009

Используйте Fusion Log Viewer для отслеживания проблем с разрешением сборок.

Если вы не хотите иметь локальную копию DLL, вы должны поместить ее в глобальный кэш сборок (GAC) или добавить инструкции Перенаправление сборки в ваш app.config или machine.config.

0 голосов
/ 10 марта 2009

Если вы не хотите распространять сторонние dll-файлы своими собственными, вы можете:

1) Укажите требования и примите, что dll будет установлен в GAC. Это не будет работать большую часть времени, и наличие сборок локально служит цели: ваше приложение не должно ломаться, если какое-то общесистемное обновление портит ваши зависимости.

2) Укуси пулю и раздавай сторонним dll своим.

3) Если это разрешено законом (следите за лицензионным соглашением сторонней библиотеки dll), используйте IL Merge для статической связи ваших сборок (вашей и любой третьей стороны). С ILMerge вы можете получить единую сборку, содержащую все ваши ссылки. Вы объединяетесь только при упаковке для развертывания (есть специальные задачи msbuild / NAnt, которые делают это за вас), когда при развертывании в VS вы просто продолжаете делать как обычно (ссылаясь на сборки). ILMerge используется во многих проектах для создания автономного компактного исполняемого файла (на ум приходит LinqPad).

0 голосов
/ 10 марта 2009

Почему неудобно копировать все внешние сборки с теми, которые вы сделали?

Вы можете использовать развертывание XCOPY, чтобы все сборки находились в 1 месте.

Другой способ развертывания ваших сборок - это упаковать их все в 1 установочный пакет (MSI).

0 голосов
/ 10 марта 2009

Приложение будет искать .dll по тому же пути, что и исполняемый файл, и в path-env. Но, как сказал BtBh: используйте выключатель только в том случае, если вы поместили эту сборку в GAC.

0 голосов
/ 10 марта 2009

Для ссылки на эту dll ее необходимо скопировать локально или в GAC (глобальный кэш сборок). Локальная копия является предпочтительным способом сделать это, поэтому я бы порекомендовал переключить локальную копию на true.

0 голосов
/ 10 марта 2009

Если для CopyToLocal установлено значение false, вы должны установить эту сборку в GAC .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...