C# использовать одну и ту же DLL (сборку) с и без "внешнего псевдонима" - PullRequest
0 голосов
/ 06 марта 2020

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

Преобразование готово и работает ("внешний псевдоним" устанавливается там, где это необходимо).
Теперь я хочу превратить мой небольшой тестовый проект в полноценную программу. Преобразование использует библиотеки DLL V22, V23 и V24, каждая с соответствующим псевдонимом, и программа должна использовать версию DLL latest (в настоящее время V24, без псевдонима, таким образом, глобального) для своей собственной операции. Проблема в том, что программа не находит никаких типов в глобальных DLL-файлах, на которые ссылаются.

Является ли Visual Studio (я использую v.2015 U3), возможно, не в состоянии различить guish между DLL, если одна и та же DLL используется с и без псевдоним?

Ссылки на проект:

основы , путь = .. \ v24 .., без псевдонима (# 1)
основы v = 22, путь = .. \ v22 .., псевдоним = V22
основы v = 23, путь = .. \ v23 .., псевдоним = V23
основы v = 24, путь = .. \ v24 .., псевдоним = V24 (# 1)
образ v = 22, путь = .. \ v22 .., псевдоним = V22
образ v = 23, путь = .. \ v23 .., псевдоним = V23
образ v = 24, путь = .. \ v24 .., псевдоним = V24
...

Я предполагаю, что отмеченные (# 1) сборки как-то сталкиваются.
Это правильно?

Любое решение или обходной путь?

Я мог бы добавить «внешний псевдоним V24» в каждый файл общей части программы, но затем мне пришлось бы изменить его на «внешний псевдоним V25», когда будет выпущена следующая версия DLL. Я бы хотел избежать этой дополнительной работы.

1 Ответ

0 голосов
/ 06 марта 2020

Я нашел приемлемый обходной путь.

Вместо добавления псевдонима к каждому «использованию», когда я переключаюсь на другую версию, например, заменить «/ * v24 * /» на «swcore_v_0_22»

using CImageObject_V_0_22         = swcore_v_0_22.SwCore.CImageObject;
using CImageObject_V_0_24         = /* v24 */     SwCore.CImageObject;
using CImageObjectStandard_V_0_22 = swcore_v_0_22.SwCore.CImageObjectStandard;
using CImageObjectStandard_V_0_24 = /* v24 */     SwCore.CImageObjectStandard;
using CImageObjectCombi_V_0_22    = swcore_v_0_22.SwCore.CImageObjectCombination;
using CImageObjectCombi_V_0_24    = /* v24 */     SwCore.CImageObjectCombination;

Я могу просто добавить вложенный с использованием, которое по умолчанию невозможно, но возможно при размещении в другом пространстве имен, см. { ссылка }. Пространство имен все равно существует.

using SwCore_v_0_22 = swcore_v_0_22.SwCore;
using SwCore_v_0_24 = global::SwCore;

namespace ConfigEditor
{
  using CImageObject_V_0_22                         /**/= SwCore_v_0_22.CImageObject;
  using CImageObject_V_0_24                         /**/= SwCore_v_0_24.CImageObject;
  using CImageObjectStandard_V_0_22                 /**/= SwCore_v_0_22.CImageObjectStandard;
  using CImageObjectStandard_V_0_24                 /**/= SwCore_v_0_24.CImageObjectStandard;
  using CImageObjectCombi_V_0_22                    /**/= SwCore_v_0_22.CImageObjectCombination;
  using CImageObjectCombi_V_0_24                    /**/= SwCore_v_0_24.CImageObjectCombination;

Позже я заменю «global» на «swcore_v_0_24» во всех файлах, что все еще является некоторой работой, но гораздо меньше, чем раньше. И поскольку заменяет вместо , добавляя , он может делать это автоматически.
Теоретически я мог бы также заменить "/ * v24 * /", но это может нарушить красивую вертикаль. выравнивание зависимости длины замены. ; -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...