2009-07-03 23 views
3

我们有一个产品使用来自第三方供应商的参考。随着他们新产品的发布,他们将这个参考文献重新命名为新名称。产品发布更改其库名称,如何兼容新旧版本?

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

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

如果我必须我们可以分支代码来处理两者,但我真的很想拥有某种适配器,所有的调用都会通过,然后调用旧的或新的。

一旦我安装新的应用程序,它将删除旧的库,所以旧的代码将不会编译。

任何可以尝试的指针或我可以如何解决此问题?

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

回答

3

Assembly Binding Redirection ...您可以将旧的DLL引用重定向到新的DLL引用。你将需要为重命名的方法编写一个包装方法。这是一个真正的痛苦。我要spitball这一关我的头顶部,所以我不保证名准确性或compilability,但你可以认为这是伪代码...

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,并且您永远不会有问题...

+0

我们不控制此库所在的应用程序以及它的一个更大的系统的一部分。我们有一个插件,通过它提供的API进行对话来完成一些功能。 我曾经在同一台机器上安装旧版和新版dll,他们确实似乎有效,但那只是一个小测试,我不确定它是否会造成更多的伤害。 我喜欢重定向的想法,并会给它一个旋转,看看我能想出什么。谢谢。 – stevemac 2009-07-07 22:47:53

1

我建议你以下步骤:

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

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

将使用Invoke调用该方法。

相关问题