Можно ли использовать несколько версий protobuf-net в одной системе Windows?

Наше приложение использует довольно недавний protobuf-net(версия 2.0.0.668), и я пытаюсь интегрироваться в другую систему с клиентской библиотекой, используя более старую версию protobuf-net(версия 1.0.0.282). Можно ли использовать библиотеки бок о бок, используя распознаватель сборок в одной и той же службе Windows? Я понимаю, что между этими версиями существуют критические изменения в терминах сериализатора, а также в Google, имеющем отдельный протокол protobuf, нарушающий изменения между версиями.

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

Даже когда решатель сборки на месте (подробности ниже). И я вызываю Assembly.Load для библиотеки, которая нуждается в старом protobuf, который, кажется, получает новую версию. Даже когда у меня нет обязательных перенаправлений на. Также я специально указал в файле проекта отключение автогенерации перенаправлений привязки.

Почему в полностью изолированном проекте по умолчанию используется новая версия protobuf, даже если я указывал ссылку на конкретную версию проекта для использования версии 1.0.0.282? В результате я не могу успешно сериализовать сообщения protobuf в библиотеке, для которой требуется версия protobuf.net версии 1.0.0.282.

У меня есть ограничения в том, что я не использую GAC, а также не создаю другую службу для переноса вызова в более старую версионную клиентскую библиотеку в другую службу, что делает его очень дорогим из-за выхода из процесса.

Моя структура проекта выглядит следующим образом

Решение |_WindowsService - обращение к DLL LibraryA и DLLLibraryB |_DLL_LibraryA - обращение к protobuf 2.0.0.668 и DLL_LibraryB |_DLL_LibraryB - обращение к protobuf 1.0.0.282 и DLL_ThirdpartyClient

Проекты DLL_LibraryA и DLL_LibraryB настроены со ссылкой на protobuf.net, чтобы использовать определенные версии и не копировать локальные.

Я создал событие сборки в проекте WindowsService, чтобы скопировать файлы protobuf-net в папки bin->ThirdParty->protobuf-net->{version}, которые будут обнаружены загрузчиком сборок, когда запускается событие resolassembly appdomain.

Даже когда я полностью изолирую сборку и настроил конфигурацию проекта, чтобы отключить автогенерацию перенаправлений привязки ( Отключить автоматическую переадресацию привязки). Мой сборочный загрузчик вызывается только для версии 2.0.0.668.

Тем не менее, один интересный момент заключается в том, что наше решение использует MEF для введения в состав и зависимость. Интересно, имеет ли это какое-либо влияние. Также, основываясь на структуре моего решения, DLL_LibraryA зависит от protobuf-net 2.0.0.668 и не напрямую от protobuf-net 1.0.0.282 через зависимость DLL_LibraryB. Что делает CLR в этом случае? Есть ли способ сделать это успешно, не выходя из процесса? Из-за сочетания зависимостей CLR всегда решал заставить меня загрузить самую новую версию?

Любая информация будет высоко ценится.

Подробности здесь:

  1. Создание преобразователя версий. Использование средства распознавания сборок. Использование параллельных сборок для загрузки версии DLL для архитектуры x64 или x32.

        public static Assembly VersionResolver(object sender, ResolveEventArgs args){
         var assemblyName = new AssemblyName(args.Name);
                var name = assemblyName.Name;
                var version = assemblyName.Version.ToString();
                string versionedAssemblyProbingPath = Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase,
                                                   string.Format(@"{0}\{1}\{2}", THIRD_PARTY_FOLDER, name, version),
                                                   string.Format("{0}.dll", name));Assembly returnAssembly = null;
            if (File.Exists(versionedAssemblyProbingPath))
            {
                returnAssembly = Assembly.LoadFile(versionedAssemblyProbingPath);
            }
            else
            {
                //Log here and return null
            }
            return returnAssembly;
    }
    
  2. Вызвать распознаватель в программе обслуживания Windows -

    static Program () {AppDomain.CurrentDomain.AssemblyResolve + = VersionResolver; }

0 ответов

Другие вопросы по тегам