如果指令不存在于 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# 中,我的预处理器指令中的代码是不是包含在编译代码中?的主要内容,如果未能解决你的问题,请参考以下文章