【问题标题】:Dynamically redirect calls to different assembly?动态地将调用重定向到不同的程序集?
【发布时间】:2014-05-15 19:30:55
【问题描述】:

我被要求在工作中做一些不寻常的事情。我们有一些客户端正在使用调用我们的 DLL(我们称之为 Sdk.dll)的应用程序。

最近,有人决定更改 Sdk 代码中的一些命名空间。如果我们向客户提供这个新的 DLL,他们的应用程序就会崩溃。

但是,一些客户端将使用新版本的 DLL(我们称之为 Sdk.Updated.dll)编写应用程序。

我的任务是以某种方式支持新旧客户端应用程序,而无需重新编译客户端应用程序。

我认为我可以简单地用新的 Sdk.dll 替换旧的 Sdk.dll,它将所有调用重定向到 Sdk.Updated.dll 中的适当被调用者。但是,为每个更改命名空间的实例编写包装类似乎很乏味。

我想知道是否有人建议以更动态的方式完成此任务?

所以,要明确一点:

客户端 1:

using Sdk;

// ...

int sum = new Calc().AddTwoNumbers(3, 4);

客户端 2:

using Sdk.Updated;

// ...

int sum = new Calc().AddTwoNumbers(3, 4);

Sdk.Updated.dll:

namespace Sdk.Updated {
    public class Calc {
        public AddTwoNumbers(int x, int y) {
            return x + y;
        }
    }
}

在我们不能重新编译客户端应用程序的限制下,支持这两个客户端应用程序的最佳方式是什么?

(作为一个额外的问题,Sdk 和 Sdk.Updated 之间的某些方法名称可能已更改,但我宁愿先了解如何处理命名空间的事情......)

【问题讨论】:

  • 查看[TypeForwardedTo][TypeForwardedFrom] 属性。我相信这些用于处理定义程序集的类型的移动。
  • 嗯,回滚编辑。
  • 很遗憾,我们无法将其回滚。我们的公司名称最初在命名空间中,但由于各种原因(在我的工资等级之外),它不得不被删除......
  • @martin_costello:我会和他们一起玩,看看他们能不能成功!
  • TypeForwardedToAttribute 非常有用,但需要您控制转发的来源。如果您不控制原始模块,您可能会使用TypeForwardedFromAttribute,但是(幸运或不幸)因为这相当于能够劫持任意类型,根据设计,CLR 完全忽略了后一个属性,并且完全没有效果。

标签: c# .net dll assemblies


【解决方案1】:

经过一些调查(包括使用命名空间别名,以及构建一个使用反射来动态生成包装 DLL 的工具),我们得出结论,如果不重新编译客户端应用程序,没有好的方法可以做到这一点。

事实上,如果不首先考虑对客户端应用程序的潜在影响,就不应该更改命名空间。 (我相信任何阅读本文的人都会明白这一点。)

希望如果您被要求做类似的事情,这可以为某人节省大量时间(和金钱)。

【讨论】:

    猜你喜欢
    • 2013-02-10
    • 1970-01-01
    • 1970-01-01
    • 2010-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-17
    • 2011-03-30
    相关资源
    最近更新 更多