【问题标题】:C# Conditional Compilation Variables Based on OS Version基于 OS 版本的 C# 条件编译变量
【发布时间】:2012-06-07 00:30:39
【问题描述】:

首先,是的,我看过这些帖子:
Is there an easy way in C# to have conditional compilation symbols based on OS version
Conditional compilation depending on the framework version in C#
但他们没有瞄准我正在寻找的方向。

我正在寻找的具体是 variable _type_ 资格(通过操作系统版本):

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 的对象,但如果我必须这样做,并将其作为其他人的参考一样的。

【问题讨论】:

  • 您的第一个示例似乎是 Visual Studio 2010 中的犹太教。您遇到错误了吗?

标签: c# variables struct operating-system conditional-compilation


【解决方案1】:

否 - 条件编译在 compile 时间工作,而看起来你正在寻找在 execution 时间工作的东西。

编辑:想想看,您可以在 one 的意义上使用条件编译:您可以尽可能将其封装在它自己的程序集中,并以两种方式编译它,生成两个单独的程序集。然后在安装时(或其他)安装正确的组件。但是,如果不知道您正在编写什么样的应用程序,就很难知道这有多可行。

【讨论】:

  • 如果是这种情况,那么@ChristopherWalker 需要恢复到他的第二个代码示例中的内容。可能是UberRuntimeConcreteTypeDucker
  • @jonnyGold:可能,是的。或者一些完全不同的方案——但绝对不是条件编译。
  • 如果我用第二个例子,问题就在于如何让程序员只使用两种适用的变量类型之一......
  • 您无法从语法上阻止它们。您将不得不依靠他们遵守规则。单元测试和一些针对规则违规的自动 grepping 可以帮助您的 CI 构建过程。
  • 所以也许是 ArgumentException("Invalid Type Object") 之类的?
【解决方案2】:

回答:“我有一些丑陋的逻辑,我害怕当我把它暴露给别人时会被滥用”

考虑公开漂亮且可用的 API,不会让任何滥用。将所有互操作类型声明为内部类和实现结构的好 API,使 REPASTESPECIAL 等最内部的类公开可见/可用并没有太大价值。

这样您可以隐藏丑陋的类/结构类型,并在需要时动态选择特定于操作系统的实现。

如果这个教育项目 - 将是了解 dependency injection 在运行时配置正确实施的好地方。

【讨论】:

  • 那么根据您的建议:对结构使用“内部”并使用公共包装器发送已编译的 dll? internal struct REPASTESPECIAL&lt;T&gt; { UInt32 dwAspect; T dwParam; }
    @EDUCATION:我正在尝试在 C# 中掌握 RichEdit 控件的全部潜力 - msdn.microsoft.com/en-us/library/windows/desktop/… - 我刚刚构建了一个包含尽可能多的结构、消息和其他代码的 UserUtils 类,以及方法。然后我在扩展的 RichTextBox 控件中使用该类。
  • 取决于你的目标。如果您想要可用的 API - 您需要努力创建一个,如果您只想让帮助对象主要为自己处理 RichEdit - 原始结构和 UserUtils 类可能就足够了。 IE。 FileStream 对象可以作为 CreateFile/ReadFileEx 函数的一组包装器方法,但它改为共享公共接口的 Stream 类之一,结果与读取器和写入器等其他 IO 对象集成。
猜你喜欢
  • 1970-01-01
  • 2014-05-10
  • 1970-01-01
  • 1970-01-01
  • 2019-06-19
  • 2018-05-27
  • 1970-01-01
  • 1970-01-01
  • 2010-09-29
相关资源
最近更新 更多