Возможно ли иметь независимые от версии DLL ссылки в классе?
Я хотел бы создать класс, который компилируется в одну DLL. Эта DLL добавит функциональность к существующему продукту.
Чтобы сделать эту работу, библиотеки DLL, связанные с обычным классом, содержатся в базовом продукте. Эти ссылки необходимы для компиляции.
Все работает отлично и компилируется пользовательский класс. Я могу удалить DLL, выпущенную в продукт, и все работает нормально.
Однако этот продукт имеет несколько версий (младшие версии, пакеты обновления). Я хотел бы распространять эту DLL для других, но я считаю, что DLL должна идеально соответствовать версии продукта. Если нет идеального соответствия, возникает следующая ошибка:
Не удалось загрузить файл или сборку 'Product.Web.UI, Version = 3.6.1920.2, Culture = нейтрально, PublicKeyToken = dfeaee0e3978ac79 'или одной из его зависимостей. Расположенные определение манифеста сборки не соответствуют ссылочной позиции сборки. (Исключение из HRESULT: 0x80131040)
Как создать DLL, которая не придирчива к ссылке на версию?
Ответы
Ответ 1
Это отличное решение. Для меня эта проблема решена.
Скомпилировать версию agnostic DLL в .NET
Если эта связь когда-либо умирает, ключ должен обрабатывать событие AppDomain.CurrentDomain.AssemblyResolve, как показано ниже. Событие срабатывает в любой момент сбоя привязки сборки, поэтому вы можете решить его самостоятельно, исправляя конфликты версий.
using System.Reflection;
static Program()
{
AppDomain.CurrentDomain.AssemblyResolve += delegate(object sender, ResolveEventArgs e)
{
AssemblyName requestedName = new AssemblyName(e.Name);
if (requestedName.Name == "Office11Wrapper")
{
// Put code here to load whatever version of the assembly you actually have
return Assembly.LoadFile("Office11Wrapper.DLL");
}
else
{
return null;
}
}
}
Ответ 2
У меня еще нет ответа на мой вопрос, но я буду использовать этот ответ для регистрации панировочных сухарей, найденных во время поиска решения.
Я нашел несколько смежный вопрос о StackOverflow:
Скомпилировать агностик версии .DLL в .NET(используя манифесты?)
У меня нет возможности изменять базовый продукт, поэтому ответ не работает для меня.
Обновлено:
Я отправил по электронной почте кого-то гораздо умнее, чем я, и вот ответ:
Когда вы ссылаетесь на сборку с сильными именами, по умолчанию Visual Studio добавляет полную ссылку на ссылочную сборку. Это означает, что он включает имя сборки, точную версию, культуру и токен открытого ключа. Если какая-либо из этой информации не соответствует описанному выше исключению.
Удаление сильных имен наших сборок просто не является вариантом. Я не буду подробно описывать, почему, но вы можете провести некоторое исследование в MSDN.
Итак, у вас есть два варианта обхода вокруг каждой версии сборок, на которые вы ссылаетесь.
В общем, второй подход рекомендуется, потому что:
1. Вы не можете использовать частичную ссылку на сборки в кеше глобальной сборки, то есть ваш элемент управления будет вызывать одно и то же исключение, если сборки находятся в GAC.
2. Вы явно указываете совместимые версии.
Ответ 3
В VisualStudio - вы попытались щелкнуть правой кнопкой мыши ссылку на сборку (dll), а затем выбранные свойства и установить "требуется определенная версия" (или так далее)?
Это может решить вашу проблему.
Андреас