Проблема с наследованием DLL - PullRequest
1 голос
/ 22 апреля 2010

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

Сама dll использует log4net и требует xml-файла для определения регистрации.

Поэтому при запуске установщика следующие файлы копируются в каталог установки внутри файлов программы: Основная dll, которую я разработал - Log4Net.dll - файл Log4Net.xml

У меня сейчас проблема. Я создал тестовое консольное приложение для экспериментов. Я добавил свою dll в качестве ссылки и установил флаг 'local copy' в false.

Однако, когда я компилировал exe тестовой консоли, я заметил, что он скопировал файлы log4net.dll и log4net.xml в каталог bin. И при запуске тестовой консоли кажется, что она будет работать, только если log4net.dll находится в том же каталоге, что и exe. Это несмотря на тот факт, что тестовое консольное приложение не использует log4net, только dll, добавленная в качестве ссылки.

Есть ли какой-нибудь способ сделать так, чтобы используемые файлы log4net.dll и xml были теми, которые были установлены в файлы программы, а не любым приложением, необходимым для копирования поверх локальных копий? Приложения, которые будут использовать мою dll, не будут использовать log4net, ее использует только dll, на которую они ссылаются.

Большое спасибо

Ответы [ 3 ]

2 голосов
/ 22 апреля 2010
  1. Не устанавливайте в глобальный кэш сборок! Даже если ваша библиотека dll используется несколькими приложениями, каждое из них должно иметь свою локальную копию. В противном случае вы попадете в целый мир боли, сэкономив несколько КБ дискового пространства.
  2. Всегда копируйте необходимые библиотеки локально. Если вы действительно уверены, что приложению оно не понадобится, вы можете позже просто удалить ненужные библиотеки или не включать их в установщик. Но если ваше приложение будет вызывать ЛЮБУЮ ссылку там, оно потерпит крах во время выполнения. Поэтому лучший вариант - оставить их там (в конце концов, на них ссылались по какой-то причине).
  3. Нет, невозможно (по крайней мере, без особых усилий) иметь dll загрузки .Net из произвольных мест на диске. И так должно быть (ищите DLL-ад, если хотите знать почему).
0 голосов
/ 22 апреля 2010

Мне удалось решить эту проблему, добавив Log4net.dll также в GAC. Теперь он будет работать без локальной копии библиотеки DLL.

Однако для правильной регистрации требуется локальная копия файла XML.

0 голосов
/ 22 апреля 2010

Я подозреваю, что ваша проблема в конфигурации. Вы должны использовать полностью определенные имена, если хотите, чтобы это работало в GAC. Согласно документации на http://logging.apache.org/log4net/release/faq.html:

"При загрузке сборки из GAC должно быть указано полное имя сборки, включая версию, культуру и открытый ключ. Это стандартный синтаксис, поддерживаемый System.Type.GetType. получить версию и открытый ключ для сборки. "

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