c# - 将调用动态重定向到不同的程序集?

标签 c# .net dll assemblies

我被要求在工作中做一些不寻常的事情。我们有一些客户正在使用调用我们的 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/

相关文章:

c# - Windows 服务未在 C# 中写入其日志文件

.net - 如何在 XSD 数据集中处理 DBNull 到 bool 值的转换?

c++ - 从 DLL 语法导出函数

c# - 使用 Rhino 从模拟对象引发事件

c# - 多个项目的通用配置

.net - Azure 在哪个 IIS 版本上运行?

dll - 重命名外部 dll 中的类,而不会在 unityEditor 中丢失对它的引用

delphi - 使用 GdiPlus 卸载 DLL 时程序挂起

c# - "Office.Interop.Outlook"不发送邮件时检测

c# - 检查索引运算符是否存在