如何编写使用某些库的不同版本的代码,这些库在没有任何代码更改的情况下进行编译

时间:2014-06-24 15:31:40

标签: c#

我希望能够编写一个使用库中代码的函数(让我们称之为 libx ),而不必根据我正在使用的libx版本更改代码。

例如

public string ReturnFormattedString(string input) {
    //If using version 1 of library
    return libx.SomeClass.FormatString(input);
    //If using version 1 of library

    //If using version 2 of library
    return libx.SomeNewClass.FormatString(intput); 
    //Note: libx.SomeNewClass is not available in version 1
    //If using version 2 of library
}

我甚至不确定这是否可行,但我想知道如何实现这样的事情,以便我能够编译我的代码而无需进行任何更改,具体取决于libx的版本是什么在使用中。

修改

只是要澄清一些事情。我无法访问libx的代码。我的应用程序是一个插件,它在另一个使用libx的程序之上工作。所以libx的版本取决于我插入的程序的版本。

我开始认为如果没有两个不同的程序集,每个程序集具有不同的ReturnFormattedString实现,根据我所针对的libx版本(这是我想要首先避免的),这可能是不可能的。

2 个答案:

答案 0 :(得分:0)

在这种情况下,您将返回一个字符串,因此即使代码确实发生更改,调用程序也看不到实现更改。但是,通常可以使用基于接口的编程:

public string ReturnFormattedString(string input, iSomeClass myInjectedClass) {
    //If using version 1 of library
    return libx.myInjectedClass.FormatString(input);
    //If using version 1 of library

    //If using version 2 of library
    return libx.myInjectedClass.FormatString(intput); 
    //Note: libx.SomeNewClass is not available in version 1
    //If using version 2 of library
}

现在调用者通过依赖注入定义了实现。

结合良好的面向对象设计,您最有可能拥有可维护的代码,以实现开放式封闭原则。

当然,现实范围内的蠕变和/或不断变化的要求最终可能会导致合同发生变化。那就是生活。

答案 1 :(得分:0)

由于项目需要某个地方的硬依赖项,除非您将每个DLL添加为参考,否则我不建议使用一个项目支持。

你可以用@ P.Brian.Mackey提到的高级设计模式来抵消成本和复杂性,例如依赖注入。我是使用设计模式来解决代码复杂性的支持者。但是,如果您正在讨论处理几个类,那可能很麻烦,因此范围在这里很重要。或者您的大部分代码都可以是中央库(可能是也可能不是PCL),只有方差在子项目中,每个版本对应一个所需的版本。

通过使用自定义条件符号,每个版本的单独项目也可以做您要求的事情。在VS项目设置中>构建选项卡,有一个条件编译符号文本框,无论你放在那里你可以做什么:

#if VERSION1
#else
#endif

并使用它来改变目标框架(see for more info)的逻辑。所有你需要做的就是更改符号,或者将代码放在一个文件夹中,并让多个项目文件指向相同的代码,每个代码都有自己的编译符号。这可能很乏味,因为您必须经常映射文件,但您可以使用Project Linker之类的工具来管理它。