Несоответствие эталонной версии сборки

Я пытаюсь сделать демонстрацию для Fusion Log Viewer, желая просмотреть журналы привязки сборки в настраиваемом каталоге.

Я только что создал для этого небольшое демонстрационное приложение:

Проект небольшой библиотеки классов, содержащий только один метод GetString () и установленную версию сборки как 1.0.0.0.

namespace ClassLibrary1
{
    public class Class1
    {
        public static string GetString()
        {
            return "yes";
        }
    }
}
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

Небольшой проект консольного приложения, ссылающийся на указанную выше библиотеку и имеющий следующий код:

Ссылки ClassLibrary1.dll Версия 1.0.0.0

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(ClassLibrary1.Class1.GetString());
            Console.ReadLine();
        }
    }
}

Я создаю это консольное приложение и закрываю визуальную студию, а затем запускаю исполняемый файл. Он печатает «да», как и ожидалось.

Затем я обновляю AssemblyInfo ClassLibrary1 следующим образом, чтобы изменить его номер версии на 2.0.0.0:

[assembly: AssemblyVersion("2.0.0.0")]
[assembly: AssemblyFileVersion("2.0.0.0")]

После замены библиотеки внутри консольного приложения на эту версию 2.0 и повторного запуска исполняемого файла он по-прежнему работает и печатает «да».

Почему он все еще работает, если в нем нет указанной DLL? Ожидается создание ошибки журнала привязки сборки внутри пользовательского каталога Fusion Log Viewer.

Кто-нибудь может объяснить, почему он все еще работает?


person Community    schedule 03.04.2014    source источник
comment
Вы, может быть, установили сборку в GAC или ее сделали NGEN?   -  person leppie    schedule 03.04.2014
comment
Нет, я не устанавливал ни в GAC, ни в NGEN.   -  person    schedule 03.04.2014
comment
Если я просто удалю ClassLibrary1.dll из корзины ConsoleApplication, тогда я получу новую запись для журнала сбоев привязки в Assembly Bind Log Viewer.   -  person    schedule 03.04.2014
comment
В качестве теста измените строку на no в v2. Также попробуйте разные версии .NET, я считаю, что это может быть что-то новое в .NET 4.5. Наконец, попробуйте обратное, скомпилируйте с v2 и ссылайтесь на v1. msdn.microsoft.com/en-us/library /2fc472t2(v=vs.110).aspx   -  person leppie    schedule 03.04.2014
comment
Вы должны быть осторожны, чтобы консольное приложение не было восстановлено. Будет, если у вас есть оба проекта в одном решении. Если вы сохраните его в отдельном решении, то файл .dll не будет скопирован в каталог bin \ Debug консольного приложения. Что-то можно увидеть с помощью Fuslogvw.exe, если записать все привязки :)   -  person Hans Passant    schedule 03.04.2014
comment
В чем необходимость перестройки консольного приложения, я построил его только один раз, ссылаясь на версию DLL 1.0, а затем, не касаясь решения консольного приложения, я создаю новую версию указанной dll и заменяю bin \ debug консоли моим новая версия, в то время как файл проекта должен по-прежнему ссылаться на старую. Теперь он не должен работать, но работает.   -  person    schedule 04.04.2014
comment
Возможный дубликат Несоответствие версии загрузки сборки: почему он загружается?   -  person riQQ    schedule 25.06.2018
comment
Я думаю, что определенные версии применяются только для сборок со строгими именами.   -  person vyrp    schedule 23.11.2020


Ответы (1)


... копирую мой ответ по существу на тот же вопрос здесь: Несоответствие версии загрузки сборки: почему она загружается? ...

Я столкнулся с тем же самым и попытался заглянуть в журналы msbuild:

msbuild /v:detailed /t:build

Интересно выглядели следующие строки:

Унифицированная зависимость «Newtonsoft.Json, Версия = 8.0.0.0, Культура = нейтральная, PublicKeyToken = 30ad4fe6b2a6aeed». Использование этой версии вместо исходной версии «7.0.0.0» в «C: \ src \ BindingTest \ Lib1 \ bin \ Debug \ Lib1.dll», поскольку AutoUnify имеет значение «true».

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

Итак, наблюдаемое нами поведение связано с "автоматическая унификация сборки "и" автоматическое перенаправление привязки "msbuild процессы.

Вот что документация говорит о параметре AutoUnify:

Если установлено значение true, результирующий граф зависимостей автоматически обрабатывается так, как если бы в параметр AppConfigFile был передан файлApp.Config. В этом виртуальном файле App.Config есть запись bindingRedirect для каждого конфликтующего набора сборок, так что выбирается сборка самой высокой версии. Следствием этого является то, что никогда не будет предупреждения о конфликтующих сборках, потому что каждый конфликт будет разрешен.

Если установлено значение true, каждое отдельное повторное сопоставление приведет к высокоприоритетному комментарию, показывающему старую и новую версии, и что AutoUnify был истинным.

Наконец, если вы хотите увидеть «сбой», вы можете вызвать msbuild со следующими аргументами:

msbuild /v:d /t:build /p:AutoUnifyAssemblyReferences=false;AutoGenerateBindingRedirects=false
person Eugene D. Gubenkov    schedule 12.05.2017