Можно ли использовать несколько версий 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 всегда решал заставить меня загрузить самую новую версию?
Любая информация будет высоко ценится.
Подробности здесь:
Создание преобразователя версий. Использование средства распознавания сборок. Использование параллельных сборок для загрузки версии 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; }
Вызвать распознаватель в программе обслуживания Windows -
static Program () {AppDomain.CurrentDomain.AssemblyResolve + = VersionResolver; }