如果指令不存在于 c# 中,我的预处理器指令中的代码是不是包含在编译代码中?

Posted

技术标签:

【中文标题】如果指令不存在于 c# 中,我的预处理器指令中的代码是不是包含在编译代码中?【英文标题】:Does my code inside preprocessor directives included in compiled code if the directive is not present in c#?如果指令不存在于 c# 中,我的预处理器指令中的代码是否包含在编译代码中? 【发布时间】:2020-09-03 09:10:44 【问题描述】:

我有一个应用程序,我想为它创建一个演示。我更愿意为我的付费版本提供另一个 exe,而为演示提供不同的 exe,以防止拥有演示版本的人破解我的付费版本。现在我已经在演示中注释了我需要的代码,所以每当我必须创建一个演示时,我都会检查这些 cmets 并进行必要的更改。今天我实现了#if指令..

现在我的问题是我是否有这样的代码

#if DEMO
   public string test()
   
     return "blabla";
   
#endif

而且我没有定义DEMO 指令,所以我的代码显然变灰了,我无法达到我目前所期望的这种方法。现在我在没有定义 DEMO 指令的情况下重建了我的项目,然后我从输出文件夹中删除了我的 .pdb 文件,之后我尝试使用 dotpeek 检查我的可执行文件,但在那里我看不到这个测试方法。

我可以使用这种方法来分离我的演示版和付费版可执行文件吗?可以说这个test 方法是一个演示方法,所以如果有人破解它,它不会在付费版本中看到。反之亦然,如果此 test 方法是付费版本方法,并且我将其放入 #if !DEMO 中,那么如果我定义 DEMO 并重建我的 exe,我将看不到此 test 方法,对吧?

正如我之前提到的,我已经检查了代码并且无法使用 dotpeek 看到我的方法,但我只想 100% 确定这些方法不会在 dotpeek 等程序或其他任何地方看到

【问题讨论】:

【参考方案1】:

是的,如果未定义符号,则代码将被完全省略。它可以是绝对的垃圾代码——编译器完全忽略它;它只是寻找结尾(#endif#else)。

关于这是否适合您对演示/付费版本的需求的问题有些不同,但从“输出中包含的内容”的技术角度来看,答案很简单。

【讨论】:

好的,谢谢,如果有另一种好方法可以为我的演示分离一些功能,我也想知道它们。我的演示方法可能是错误的方式,但至少我的演示代码将始终是最新的,并且每次我想为我的应用程序发布新的演示版本时,我都不必超过数百行,我所拥有的要做的是定义 DEMO 并重建我的代码。 @ShinoLex:您应该在每个帖子中坚持一个问题 - 如果您想询问如何构建演示版本,您需要包含 真的,真的具体要求,否则可能会因为过于宽泛而被关闭。

以上是关于如果指令不存在于 c# 中,我的预处理器指令中的代码是不是包含在编译代码中?的主要内容,如果未能解决你的问题,请参考以下文章

C# 预处理器指令中的源代码和 PDB 文件中的行号

C#预处理器指令

是否有任何控制循环展开的预处理器指令?

C#预处理器指令之#define/#undefine/#if/#elif/#else/#endif

C# 预处理器指令

在 C# 的 #if 中使用 #define 预处理器指令是不是有效