我被要求在工作中做一些不寻常的事情。我们有一些客户正在使用调用我们的 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 之间更改,但我宁愿先了解如何处理命名空间的事情...)
最佳答案
经过一些调查(包括使用 namespace 别名,以及构建一个使用反射动态生成包装器 DLL 的工具),我们得出结论,如果不重新编译客户端应用程序,就没有好的方法可以做到这一点。
事实上,如果不首先考虑对客户端应用程序的潜在影响,就不应该更改命名空间。 (我相信任何阅读本文的人都会明白这一点。)
如果您被要求做类似的事情,希望这能为某人节省大量时间(和金钱)。
关于c# - 将调用动态重定向到不同的程序集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23687077/