C# 预处理器指令“正在使用”生成dll

C# 预处理器指令“正在使用”生成dll,c#,dll,build,c-preprocessor,C#,Dll,Build,C Preprocessor,我有一个有几个实用函数的类。该类被编译为dll,然后在用户编辑器中使用,其中有3个操作版本 这三个版本让我们称它们为A、B和C。它们使用的核心库在这三个版本中略有不同,但命名为相同的文件,并且具有重叠的函数和类 为了编译我的dll并能够与编辑器交互,我选择了核心库的一个版本,并在我的解决方案中引用了它。 为了方便与其他版本的交叉兼容性,我选择了核心库的B版本 现在我面临的问题是:核心库中的一些函数/类属性在一个版本中相对于其他版本丢失,但我需要能够处理这些函数和类,并在运行时“决定”它们?要使用

我有一个有几个实用函数的类。该类被编译为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
另一种选择是,我使用了反射,但它感觉很脏,因为我被迫在运行时进行“属性检查”,而不是“版本检查”


所以问题是,有没有可能在我的代码中维护这些指令,以便在运行时而不是在构建时考虑它们?我有点理解这不是指令的工作方式,因此我希望有一种替代方案或方法来实现所需的结果。

就兼容性而言,这似乎是一个糟糕的设计,严格来说是因为X.dll并不总是相同的X.dll。也就是说,如果您的库可以指定某种版本标识符,则VERSION\u返回0x01;endif或类似的,对于每个版本,通过一个公共属性或我敢说是-field,那么您可以很容易地使用它来确定要使用哪个API。附录:这要求编辑核心库/框架的源代码。谢谢提示。不幸的是,我没有访问核心库源代码的权限。
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.