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

У меня абсурдная ситуация (не вините меня, это стороннее программное обеспечение), где мне нужно иметь две ссылки (Erp.Contracts.BO.Quote и Erp.Contracts.BO.SalesOrder), но тип Erp.Tablesets. QuoteQtyRow определен в обеих сборках!

Как использовать их в коде?

void Absurdity()
{
    Erp.Tablesets.QuoteQtyRow qqr_Quote = null; //<-- my intention is to use the one from the quote assembly here.
    Erp.Tablesets.QuoteQtyRow qqr_SO = null; //<-- my intention is to use the one from the sales order assembly here.
}

Компилятор выдает ошибку. А именно: «Тип Erp.Tablesets.QuoteQtyRow существует в обеих сборках».

РЕДАКТИРОВАТЬ: ОГРАНИЧЕНИЯ:

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

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

  3. Возможно, решения нет, но я хочу исчерпать все свои ресурсы, прежде чем откажусь от проблемы.


person Price Jones    schedule 19.01.2017    source источник
comment
bing.com/search?q=c%23+ одинаковый + тип + два + сборка   -  person Alexei Levenkov    schedule 19.01.2017
comment
@AlexeiLevenkov Я знаю, что такое пространство имен и как использовать bing. Не могли бы вы предложить что-нибудь более конкретное?   -  person Price Jones    schedule 19.01.2017
comment
Пожалуйста, отредактируйте сообщение, чтобы было понятно, какие ограничения существуют, чтобы сообщение можно было повторно открыть (и, возможно, кто-то ответил). Боковое примечание: сообщение должно демонстрировать, какое исследование вы уже провели - сам факт, что вы можете использовать поисковые системы, не имеет большого значения для самого сообщения SO.   -  person Alexei Levenkov    schedule 19.01.2017


Ответы (1)


Epicor ERP использует инструмент для объединения таблиц из БД в наборы данных, а затем в бизнес-объекты. Этот бизнес-объект описан в сборке контракта, но, как вы обнаружили, когда вы используете два бизнес-объекта, которые ссылаются на одну и ту же таблицу, вы сталкиваетесь с проблемами. Это чаще всего проблема с таблицами SerialNumber.

Насколько я понимаю из ваших заметок, вы предоставляете код тела метода в директиве метода или директиве данных в приложении Epicor ERP. Он вводится на клиенте и сохраняется в базе данных, но генерирует код на сервере в папке Deployment \ Server \ BPM \ Sources \ BO и компилируется в папку Deployment \ Server \ Customization \ BO.

Невозможно указать псевдоним для указанной библиотеки DLL в элементе рабочего процесса «Выполнение настраиваемого кода» конструктора BPM. Исправление запрашивается в SCR 148549. Нет файла проекта, который можно было бы редактировать, и даже если бы он был каждый раз, когда BPM был включен и отключен, он будет регенерироваться.

Однако, если вы используете элемент рабочего процесса «Вызов внешнего метода», вы можете создать свою собственную dll и поместить ее в папку Deployment \ Server \ Customization \ Externals. Для этого:

  • Щелкните Действия> Создать интерфейсы программирования для вашего метода в разделе «Ведение директив метода» для вашего BPM и скопируйте код.
  • Создайте новый проект библиотеки классов в Visual Studio
  • Вставьте скопированный код в файл .cs
  • Add Assemblies - Framework references:
    • System.Data.Entity
    • System.ServiceModel
    • System.Transactions
  • Add file references to
    • Bin\Epicor.ServiceModel.dll
    • Сборки \ Epicor.Ice.dll
    • Сборки \ Epicor.System.dll
    • Сборки \ Ice.Data.Model.dll
    • Сборки \ Erp.Data.910100.dll
  • And add a reference for the BPM's BO i.e.
    • Assemblies\Erp.Contracts.BO.Quote.dll
  • Убедитесь, что для всех ссылок для параметра Copy Local установлено значение false.
  • Наследовать от Ice.ContextBoundBase<Erp.ErpContext>
  • Добавьте конструктор, который принимает контекст public MyQuote (Erp.ErpContext ctx) : base(ctx){ }

Вы не можете полностью скопировать и вставить тело «Execute Custom Code», так как у вас не будет доступа к переменным строки tt, все они находятся в ds.

person Stephen Turner    schedule 20.01.2017
comment
Я мог следить за всем, за исключением того, что не могу найти Ice.ContextBoundBase ‹›. Вы знаете, в какой сборке он находится? - person Price Jones; 09.05.2017
comment
Он должен находиться в Server \ Assemblies \ Epicor.Ice.dll, втором в списке. - person Stephen Turner; 10.05.2017