В.NET нужно ли регистрировать DLL?
Необходимо ли зарегистрировать скомпилированную DLL (написанную на C# .NET) на целевой машине.
На целевом компьютере будет установлен.NET. Достаточно ли просто поместить DLL на целевой компьютер?
7 ответов
Я думаю, вы немного запутываете. Регистрация DLL никогда не была необходима, чтобы использовать его.
Использование библиотеки DLL требует только ее загрузки (с учетом известного местоположения или если библиотека находится в системном пути) и получения адреса функции, которую вы хотите использовать.
Регистрация DLL была использована при распространении объектов COM или ActiveX, которые должны добавить определенные записи в реестр Windows. Чтобы использовать службу COM (например), вам нужно сослаться на GUID, то есть уникальный идентификатор, который позволяет вам получить указатель на dll, которая реализует службу (или предоставить доступ к ней). Иногда вы можете сделать ссылку на полное имя и получить те же результаты.
Для того чтобы все это работало, dll нужно было зарегистрировать. Этот процесс "регистрации" просто создает несколько записей в реестре, но в основном это две: одна связывает GUID с местоположением dll (так что вы можете ссылаться на него через GUID, не зная, где он точно расположен), а вторая - ассоциирование полного имени с GUID. Но опять же, это только для объектов COM или ActiveX.
Когда вы разрабатываете приложение в.NET, библиотеки, на которые есть ссылки в вашем проекте, автоматически загружаются, когда они необходимы, и вам не нужно беспокоиться о том, чтобы найти или загрузить их. Для этого фреймворк проверяет два места для указанных библиотек.
- Первое местоположение - путь к приложению.
- Второе местоположение - GAC.
GAC (Global Assembly Cache) позволяет эффективно регистрировать dll для использования во всей системе и работает как эволюция старого механизма регистрации.
Так что в основном вам просто нужно поместить DLL в ту же папку приложения.
Вам нужно "поместить" его в каталог, где нужное приложение найдет его.
Если имеется несколько приложений или вы хотите "удалить" файл где-то, кроме каталога приложений, вам, как правило, необходимо либо настроить переменную PATH, либо зарегистрировать сборку в глобальном кэше сборок (GAC).
Одна из главных выгод.NET для платформы Windows, когда она появилась на сцене, заключается в том, что по умолчанию библиотеки сборки.NET не должны регистрироваться и могут использоваться приложением в частном порядке, просто помещая их в одну и ту же папку. папка в виде файла EXE. Это был большой шаг вперед, поскольку он позволил разработчикам избежать драки DLL/COM-ада.
Совместно используемые модули DLL/COM оказались одной из самых больших ошибок проектирования Windows, поскольку это приводит к нестабильности приложений, которые устанавливают пользователи. Установка нового приложения может испортить приложение, которое работало просто отлично - потому что новое приложение представило более новые версии общих модулей DLL/COM. (На практике это оказалось слишком обременительным для разработчиков, чтобы должным образом управлять детальными зависимостями версий.)
Одно дело управлять версиями модулей с помощью системы репозитория сборок, такой как Maven. Maven работает очень хорошо, делая то, что делает.
Однако совсем другое дело - решать эту проблему в среде выполнения конечного пользователя, распространяющейся среди миллионов пользователей.
.NET GAC ни в коем случае не является достаточным решением этой старой проблемы Windows.
Собранные DLL библиотеки по-прежнему предпочтительнее. Это простой способ, так как дисковое пространство в наши дни чрезвычайно дешевое (~ 100 долларов может терабайтным диском у Фрая в наши дни). Нельзя получить ничего, делясь сборками с другими продуктами - и все же репутация компании теряется, когда дела идут плохо для бедного пользователя.
Если вы хотите получить доступ к сборке через com +. Примером может служить использование типа, определенного в сборке.NET из приложения, отличного от.NET, такого как приложение winforms VB6.
Если вы планируете получить доступ к сборке из другого приложения.NET, вам не нужно ничего делать. Если ваша сборка имеет строгое имя, то, вероятно, будет хорошей идеей добавить ее в GAC. В противном случае просто поместите его в каталог приложения, которое будет ссылаться на него.
Обычно достаточно поместить dll в папку вашего приложения на целевой машине.
Если DLL должен быть доступен для других приложений, то вы можете рассмотреть GAC.
На самом деле нет необходимости регистрировать DLL в.NET на целевой машине.
Если вы ссылаетесь на DLL в вашем приложении, щелкните по ссылке на DLL в ссылках в вашем проекте, посмотрите на свойства и установите для параметра "Изолированный" значение "ИСТИНА".
Теперь это автоматически включит этот.dll в ваш проект, и ваше приложение будет использовать копию.dll, включенную в ваш проект, без необходимости регистрировать ее в целевой системе.
Чтобы увидеть рабочий пример этого посмотрите здесь:
http://code.msdn.microsoft.com/SEHE
.Dll, о котором идет речь, нужно будет зарегистрировать в системе, где вы создаете приложение, чтобы это работало должным образом. Однако после того, как вы соберете свой проект, больше не будет необходимости регистрировать рассматриваемый DLL-файл в любой системе, в которой вы развертываете свое приложение или программу.
Дополнительным преимуществом использования этого метода является то, что даже если в будущем другой DLL-файл будет зарегистрирован с тем же именем в рассматриваемой целевой системе, ваш проект будет продолжать использовать DLL-файл, с которым вы развернули. Это очень удобно, когда.dll имеет много версий, и вы хотите сохранить некоторую стабильность, например, использовать ту, с которой вы тестировали, но все остальные приложения будут использовать зарегистрированный.dll, если только они не используют метод isolated = true.
Приведенный выше пример является одним из таких случаев, есть много версий Skype4COM, который является API-интерфейсом Skype API .dll и может часто меняться.
Этот метод позволяет в приведенном выше примере использовать API.dll, с которым тестировался проект, каждый раз, когда пользователь устанавливает новую версию Skype, возможно, что установлена модифицированная версия этой.dll.
Кроме того, есть некоторые клиенты Skype, которые не устанавливают этот.dll, например, бизнес-версия клиента Skype меньше и не включает этот.dll, поэтому в этом случае проект не завершится с ошибкой на этом.dll отсутствует и не регистрируется, потому что он включен в проект как изолированный = true.
Приложение может использовать.NET dll, просто разместив его в одной папке с приложением.
Однако, если вы хотите, чтобы другие сторонние приложения находили DLL и использовали ее, они также должны были бы включить ее в свой дистрибутив. Это может быть нежелательно.
Альтернативой является регистрация DLL в GAC (глобальный кэш сборок).