【问题标题】:How do I use a type with the same name of another type in another referenced assembly?如何在另一个引用的程序集中使用与另一个类型同名的类型?
【发布时间】:2017-06-04 10:25:51
【问题描述】:

我有一个荒谬的情况(不要怪我,它是第三方软件),我需要两个引用(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. 我没有使用此答案 Class with same name in two assemblies (intentionally) 中提供的外部别名的灵活性。我受限于第三方软件提供的环境。我本质上需要一种方法来区分方法体。

  2. 我知道我可以通过使用 dynamic 关键字完全避免这个问题,但我正在寻找一种可能的强类型解决方案。

  3. 可能没有解决方案,但我想在我放弃这个问题之前耗尽我所有的资源。

【问题讨论】:

  • @AlexeiLevenkov 我知道命名空间是什么以及如何使用必应。你能提供更具体的吗?
  • edit 发帖,以便清楚有哪些限制,以便可以重新打开帖子(并且可能有人回答)。旁注:帖子应该展示您已经完成了哪些研究——只是您可以使用搜索引擎这一事实对于 SO 帖子本身并没有多大意义。

标签: c# namespaces epicorerp fully-qualified-naming


【解决方案1】:

Epicor ERP 使用一种工具将数据库中的表组合成数据集,然后再组合成业务对象。此业务对象在合同程序集中进行了描述,但正如您所发现的,当您使用两个引用同一个表的业务对象时会遇到问题。这通常是 SerialNumber 表的问题。

我从您的注释中了解到,您在 Epicor ERP 应用程序中的方法指令或数据指令中提供方法主体代码。这是在客户端输入并存储在数据库中,但在服务器上的 Deployment\Server\BPM\Sources\BO 文件夹中生成代码并编译到 Deployment\Server\Customization\BO 文件夹中。

无法在 BPM 设计器的“执行自定义代码”工作流项中为引用的 DLL 指定别名。 SCR 148549 中要求修复。没有可供您编辑的项目文件,即使每次启用和禁用 BPM,它也会重新生成。

但是,如果您使用“调用外部方法”工作流程项,则可以构建自己的 dll 并将其放在 Deployment\Server\Customization\Externals 文件夹中。为此:

  • 在您的 BPM 的方法指令维护中单击操作 > 为您的方法创建编程接口并复制代码。
  • 在 Visual Studio 中新建一个类库项目
  • 将复制的代码粘贴到 .cs 文件中
  • 添加程序集 - 框架参考:
    • System.Data.Entity
    • System.ServiceModel
    • System.Transactions
  • 将文件引用添加到
    • Bin\Epicor.ServiceModel.dll
    • 程序集\Epicor.Ice.dll
    • 程序集\Epicor.System.dll
    • 程序集\Ice.Data.Model.dll
    • 程序集\Erp.Data.910100.dll
  • 并为 BPM 的 BO 添加参考,即
    • 程序集\Erp.Contracts.BO.Quote.dll
  • 确保所有引用都将 Copy Local 设置为 false。
  • 继承自Ice.ContextBoundBase&lt;Erp.ErpContext&gt;
  • 添加一个接受上下文public MyQuote (Erp.ErpContext ctx) : base(ctx){ }的构造函数

您无法完全复制并粘贴“执行自定义代码”正文,因为您无法访问 tt 行变量,这些都在 ds.

【讨论】:

  • 除了找不到 Ice.ContextBoundBase 之外,我什么都能看。你知道它驻留在哪个程序集中吗?
  • 它应该在Server\Assemblies\Epicor.Ice.dll,列表中的第二个。
猜你喜欢
  • 2014-04-25
  • 1970-01-01
  • 1970-01-01
  • 2021-08-11
  • 2021-10-31
  • 1970-01-01
  • 2016-06-05
  • 2021-09-28
  • 2014-11-18
相关资源
最近更新 更多