Возможно ли иметь независимые от версии ссылки на DLL в классе? - PullRequest
19 голосов
/ 14 мая 2009

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

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

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

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

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

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

Ответы [ 3 ]

7 голосов
/ 01 сентября 2010

Это отличное решение. Это решило подобную проблему для меня.

Скомпилируйте независимую от версии 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;
        }
    }
}
4 голосов
/ 14 мая 2009

У меня пока нет ответа на мой вопрос, но я буду использовать этот ответ, чтобы регистрировать крошки, найденные при поиске решения.

Я нашел несколько связанный вопрос по StackOverflow:

Скомпилируйте независимую от версии версию .DLL в .NET (с помощью манифестов?)

Однако у меня нет возможности изменять базовый продукт, поэтому ответ мне не подходит.


Изменено:

Я написал кому-то намного умнее меня, и вот ответ:

Когда вы ссылаетесь на сборку со строгим именем, по умолчанию Visual Studio добавляет полную ссылку на указанную сборку. Это означает, что оно включает название сборки, точную версию, культуру и маркер открытого ключа. Если какая-либо из этой информации не соответствует описанному, генерируется исключение.

Удаление строгих имен наших сборок просто не вариант. Я не буду вдаваться в подробности, почему, но вы можете сделать некоторые исследования в MSDN.

Итак, у вас есть два варианта обхода сборки для каждой версии сборок, на которые вы ссылаетесь.

  1. Вы можете сделать частичные ссылки. Смотрите эту статью: http://msdn.microsoft.com/en-us/library/0a7zy9z5(VS.71).aspx.
  2. Вы можете объявить совместимые версии с перенаправлением привязки в web.config. Смотрите эту статью: http://msdn.microsoft.com/en-us/library/433ysdt1.aspx.

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

0 голосов
/ 14 мая 2009

В VisualStudio - пробовали ли вы щелкнуть правой кнопкой мыши на сборке, на которую ссылаются (dll), а затем выбрали свойства и установить «требуется конкретная версия» (или около того)? Это может решить вашу проблему.

Andreas

...