我被要求在工作中做一些不寻常的事情。我们有一些客户端正在使用调用我们的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之间进行了更改,但我只是想知道如何首先处理名称空间事物......)
答案 0 :(得分:1)
经过一些调查(包括使用命名空间别名,并构建一个使用反射来动态生成包装器DLL的工具),我们得出结论,没有重新编译客户端应用程序就没有好办法。
事实上,如果没有首先考虑对客户端应用程序的潜在影响,就不应该更改名称空间。 (我确信这对读这篇文章的人来说是显而易见的。)
如果你被要求做类似的事情,希望这可以节省很多时间(和金钱)。