Подтвердить что ты не робот

Возможно ли иметь независимые от версии DLL ссылки в классе?

Я хотел бы создать класс, который компилируется в одну DLL. Эта DLL добавит функциональность к существующему продукту.

Чтобы сделать эту работу, библиотеки DLL, связанные с обычным классом, содержатся в базовом продукте. Эти ссылки необходимы для компиляции.

Все работает отлично и компилируется пользовательский класс. Я могу удалить DLL, выпущенную в продукт, и все работает нормально.

Однако этот продукт имеет несколько версий (младшие версии, пакеты обновления). Я хотел бы распространять эту DLL для других, но я считаю, что DLL должна идеально соответствовать версии продукта. Если нет идеального соответствия, возникает следующая ошибка:

Не удалось загрузить файл или сборку 'Product.Web.UI, Version = 3.6.1920.2, Culture = нейтрально, PublicKeyToken = dfeaee0e3978ac79 'или одной из его зависимостей. Расположенные определение манифеста сборки не соответствуют ссылочной позиции сборки. (Исключение из HRESULT: 0x80131040)

Как создать DLL, которая не придирчива к ссылке на версию?

4b9b3361

Ответ 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), а затем выбранные свойства и установить "требуется определенная версия" (или так далее)? Это может решить вашу проблему.

Андреас