3

我们有一个产品使用来自第 3 方供应商的参考。随着他们新产品的发布,他们已将此参考重命名为新名称。

我们想要做的是编译我们的应用程序的一个版本,以便它可以针对库的旧名称和新名称运行。

我们使用的库的各个部分之间基本上没有变化,只有 1 个方法重命名,但我不知道如何开发我们的应用程序来处理这两者。

如果必须,我们可以将代码分支以与两者一起使用,但我真的希望有某种适配器,所有调用都通过它然后分派到旧的或新的。

安装新应用程序后,它会删除旧库,因此旧代码将无法编译。

关于我可以尝试什么或如何解决此问题的任何指示?

此外,该应用程序是使用 Visual Studio 2005 在 C# 中开发的。

4

2 回答 2

3

查看程序集绑定重定向...您可以将旧的 DLL 引用重定向到新的引用。您将需要为重命名的方法编写一个包装器方法。这真是让人头疼。我要把这个从头顶吐出来,所以我不保证名称的准确性或可编译性,但你可以认为它是伪代码......

private bool _useOldMethodName = false;
public void MethodAlias(string arg1)
{
    if (_useOldMethodName)
    {
        Reference.OldFunctionName(arg1);
    }
    else
    {
        try
        {
            Reference.NewFunctionName(arg1);
        }
        catch (MethodNotFoundException mnfe)
        {
            _useOldMethodName = true;
        }
    }
}

类似的东西。在任何情况下都不理想。

我很好奇,为什么你不能总是使用新的参考?只需将新的参考 DLL 与您的代码一起分发,您将永远不会遇到问题...

于 2009-07-07T00:39:56.897 回答
1

我建议您执行以下步骤:

  • 重构您的代码以通过拥有从库继承的您自己的类来隔离对库的调用(目前没有自己的方法 - 只有一个更改位置)
  • 在这个单一类中使用反射来找出两种方法中的哪一种可用。当您非常频繁地调用库时,缓存实际方法以避免性能损失。实际的反射将如下所示:

    类型类型 = Type.GetType(alien); MemberInfo[] mbrInfoArray=type.GetMethods();

该方法将使用 Invoke 调用。

于 2009-07-03T05:09:49.280 回答