预处理器指令"被消费"建设DLL

时间:2015-04-09 19:13:59

标签: c# dll build c-preprocessor

我有一个具有多个实用功能的类。该类编译为dll,然后在用户编辑器中使用,其中有3个操作版本。

这三个版本(我们称之为A,B和C)使用的核心库在三个版本中略有不同,但命名方式与文件完全相同,并且具有重叠的函数和类。

为了编译我的dll并能够与编辑器交互,我选择了一个版本的核心库,并在我的解决方案中引用它。 为了方便与其他版本的交叉兼容性,我选择了核心库的B版本。

现在我遇到的问题:核心库中的一些函数/类属性在一个版本中缺少其他版本,但我需要能够解决这些函数和类并“决定”(在运行时?)要使用哪个属性,以解决用户正在运行的类/函数的特定于版本的属性。 每个版本的编辑器都会使用其版本公开全局定义。

Simple example:
Version A Class_A
property_1
property_2

Version B Class_A identical to version A

Version C Class_A
property_1
property_3 <= property 2 has disappeared, I must use this as per new api specifications

我已经尝试使用这些定义,但我意识到这些是在我构建时被“消耗”的,并且由于我引用了编辑器的B版本,我的DLL被“洗礼”,好像用户编辑器是B,无论以后哪个编辑器都使用DLL。

Simple example:
... //some code in my library
public void UseClassA() {
    Class_A newclassA = new Class_A();
    newclassA.property_1 = "x";
    #if VERSION_A || VERSION_B
    newclassA.property_2 = "y";
    #endif

    #if VERSION_C
    newclassA.property_3 = "y";
    #endif
}
^^^ Version C users will get an error when calling this function, since my dll is built with reference to VERSION_B's core dll.

作为替代方案,我使用了反射,但由于我不得不在运行时进行“属性检查”而不是“版本检查”,因此感觉很脏。

所以问题是,是否可以在我的代码中维护指令,以便在运行时而不是在构建期间考虑它们?我有点明白这不是指令的工作原理,所以我希望有一种替代或方法来达到预期的效果。

0 个答案:

没有答案