2010-04-22 4 views
1

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

В самой dll используется log4net и для определения журнала требуется файл xml.

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

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

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

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

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

ответ

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

К сожалению, при использовании локальных копий любых DLL это не вариант. Это связано с требованиями проекта, так как клиент хотел бы, чтобы они были автономными exe, которые они могут запускать. Вот почему я добавил свою DLL в GAC. – Adam

+1

Это помада на свиньи. Это * не * автономный exe, ему нужна сборка в GAC и XML-файл где-то, что его настраивает. Единственный момент наличия «самостоятельного exe» не требует установки. Это свинья, которая не полетела. –

+0

Он должен быть автономным с точки зрения возможности запуска из любого каталога на главной машине. Клиенту нужен чистый каталог, полный exe, который они могут запускать, а не каталог, полный exe и поддерживающий файлы DLL/xml. У меня на самом деле почти все работает, просто добавив log4net.dll в GAC, но теперь у меня есть проблема, когда он не подбирает xml-файл. Однако это шаг вперед. Я согласен с вашими мыслями, что это может быть не лучшее решение, однако, к сожалению, это не мой дизайн, и я ограничен рамками, которые хочет наш клиент. Большое спасибо – Adam

0

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

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

+0

Благодарим за обновление, однако я смущен тем, как мне нужно будет изменить свой appender. Вот мой тег appender: Затем я ссылаюсь на это с помощью appender-ref. i.e: Ни в коем случае не использую имя класса, находящегося в GAC. – Adam

+0

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

0

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

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

Смежные вопросы