Visual Studio 和 .NET 中的条件文件编译

本文关键字:条件 文件 编译 Studio NET Visual | 更新日期: 2023-09-27 18:34:19

我正在为我的公司开发一个软件工具。我正在使用Visual Studio,C#并面向.NET 4.0。其中一个要求是该软件将以三个版本(有限,标准和扩展(发布。我公司有几名实习生/实习生,还有一些正式员工和经理。每个小组都将获得其他版本的软件。实习生限量版,员工标准版和经理扩展版。这些是给我的要求。此外,每个版本都必须是一个可执行文件(没有 dll 文件(。

因此,我创建了一个包含一组文件的项目,这些文件将被有条件地编译和构建。在主程序中,我可以使用指令 #if 和/或 [Conditional] 属性根据当前配置仅实例化所需的类。

但是当前不必要的文件无论如何都会被编译和构建。并且创建的可执行文件包含这些文件中的所有代码,这是不希望的,并且不符合给我的要求。每个可执行文件应仅包含目标员工组所需的代码。(这是出于安全原因。

所以我的问题是,如何根据当前配置从编译过程中排除一组文件?

Visual Studio 和 .NET 中的条件文件编译

你想实现的是开发一个软件产品线(1(。这个领域有很多研究正在进行中。当前的解决方案非常有限,其中大多数已经在评论中提到:

  • 使用 #if 编译器指令忽略不需要的文件 (CodeNaked(
  • 管理多个解决方案文件(韦兰·汤谷(
  • 使用功能 IDE (2( 或其他一些工具/帮助程序进行功能定位 (3( 并将这些高级版本开发为功能(这将需要一些额外的时间来进入(
  • 当然,您可以使用上述组合

您还可以完全独立地开发这 3 个应用程序,这不是您想要的。但也要注意的是,您可以提取库中的常用功能,然后使用 ILMerge(4( 返回每个版本的单个.exe文件。

我认为这些是你的选择,你应该选择最适合你情况的组合。如果您的三个应用程序非常相似并且共享许多功能,我会选择"#if"或多个解决方案文件(因为您仅限于 3 个版本(。如果版本差异很大,也许 ILMerge 和提取通用功能是更好的方法。我不知道面向功能是否已准备好生产,因此为了完整性起见,我提到了它们。

不要忘记CodeNaked的评论:您的安全性实际上不应该依赖于用户可用的代码......