基于 OS 版本的 C# 条件编译变量
本文关键字:条件 编译 变量 OS 版本 基于 | 更新日期: 2023-09-27 18:36:07
首先,是的,我看过这些帖子:
C# 中是否有一种简单的方法可以基于操作系统版本
使用条件编译符号取决于 C#
中的框架版本的条件编译但它们没有针对我正在寻找的方向。
我特别要寻找的是通过操作系统版本的变量_类型_限定:
public struct REPASTESPECIAL
{
UInt32 dwAspect;
#if WINVER >= 6.0
UIntPtr dwParam;
#else
UInt32 dwParam;
#endif
}
我不想恢复到这样的事情:
public struct REPASTESPECIAL<T>
{
UInt32 dwAspect;
T dwParam;
}
// return type by OS version
public static Type GetRePasteSpecial_ParamType()
{
if (Environment.OSVersion.Version.Major >= 5) return typeof(IntPtr);
else return typeof(UInt32);
}
。因为当我希望 dwParam 仅是 IntPtr 或 UInt32 对象时,这将允许程序员使用任何类型 T 的对象,但如果必须如此,那就这样吧,并将其作为其他人寻找相同内容的参考。
否 - 条件编译在编译时工作,而看起来你追求的是执行时工作的东西。
编辑:只是考虑一下,你可以在一种意义上使用条件编译:你可以尽可能地将其封装在它自己的程序集中,并以两种方式编译它,生成两个单独的程序集。然后在安装时(或其他什么)安装正确的组件。但是,如果不知道您正在编写哪种应用程序,就很难知道这有多可行。
回答:"我有一些丑陋的逻辑,我担心当我把它暴露给别人时会被滥用"
考虑公开漂亮且可用的API,它不允许任何滥用。将所有互操作类型声明为内部类和实现结构,如果你是很好的API,使像REPASTESPECIAL这样的最内部类成为公开可见/可用的没有多大价值。
通过这种方式,您可以隐藏丑陋的类/结构类型,并在需要时动态选择特定于操作系统的实现。
如果这个教育项目 - 那么它将是学习依赖关系注入以在运行时配置正确实现的好地方。