【发布时间】: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