【问题标题】:C# VS 2008 Build Configurations - using different classes for different buildsC# VS 2008 构建配置 - 为不同的构建使用不同的类
【发布时间】:2011-03-01 19:30:19
【问题描述】:

我正在编写一个应用程序,它有两个类,它们提供基本相同的功能,但适用于不同的情况。我想要三个版本的软件 - 一个用户可以更改 ini 文件以将程序配置为使用两个类之一,然后一个版本只使用两个类之一。

现在我通过一个 ini 文件让它工作,但我希望能够构建完全不包含不需要的类的代码的版本。

解决此问题的最佳方法是什么?我目前的想法是,由于这两个类都派生自一个公共接口,我将只添加一个编译时条件,它查看活动的构建配置并决定是否编译该类。这样做的语法是什么?

提前感谢您的帮助和意见!

【问题讨论】:

    标签: c# visual-studio-2008 build-process


    【解决方案1】:

    您可以使用条件编译符号,这类似于您在 C/C++ 中使用预编译器指令执行的操作。

    例如:

    interface IThing {
    }
    
    #if PLATFORM_A
    
    class ThingImplementation : IThing {
    }
    
    #endif
    
    #if PLATFORM_B
    
    class ThingImplementation : IThing {
    }
    
    #endif
    

    您可以通过在项目设置的“构建”选项卡中添加条件编译符号来选择所需的实现。

    对于一个非常基本的实现,实际上您根本不需要接口,只需根据您正在编译的平台删除不需要的代码(即使接口对于强制一致性很有用)。

    class Thing {
    
    #if PLATFORM_A
    
        Platform specific code
    
    #endif
    
    #if PLATFORM_B
    
        Platform specific code
    
    #endif
    
    }
    

    【讨论】:

    • 如何使用构建类型作为条件编译符号。例如,如果不添加新的构建类型,我将如何做类似如果 DEBUG 或 RELEASE 的事情。谢谢你的回答!
    • DEBUG 常量由 Visual Studio 在使用默认的“调试”构建配置时添加。因此,您可以使用#if DEBUG 而无需定义额外的符号(请注意,发布配置没有定义RELEASE,而是根本没有定义DEBUG)。对于额外的符号,您必须手动将它们添加到您创建的构建配置中(在 VS 项目的“构建”选项卡中)。我认为使用#if 指令时没有办法检查构建配置的名称。
    【解决方案2】:

    最好将每个派生类放在自己的程序集中。在运行时,加载与您的应用程序一起部署的程序集,并转换为基接口或抽象类。

    【讨论】:

    • 所以现在我有一个接口和两个派生类。您认为我应该将实现从主代码中提取出来并将其放入两个程序集中,然后检查哪些有运行时?我该怎么做?感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2015-09-17
    • 1970-01-01
    • 2011-03-16
    • 2014-02-05
    • 2011-06-18
    • 2010-12-05
    • 1970-01-01
    • 2014-09-16
    相关资源
    最近更新 更多