【问题标题】:C# Preprocessor working locally but not when deployedC# 预处理器在本地工作,但在部署时不工作
【发布时间】:2016-01-24 19:20:18
【问题描述】:

有一个简短的问题。

我创建了一个新的构建配置并添加了一个名为“TEST”的预处理器指令/符号来测试一些东西。

我正在使用网络表单。当我在 .cs 中执行此操作时

var isTestSet = false

#if TEST
        isTestSet = true;
#else
        isTestSet = false;

然后在我的 ascx 本身的标记中,我做了一个快速测试:

<% if (isTestSet == true) 
     alert("test is set");
   else
     alert("test is not set");
%>

在我的本地开发环境中,这非常有效。如果我在 TEST 中构建解决方案,它会提醒它已设置。当我在调试模式或发布模式下构建它时,它会提醒它没有设置。但是,当我使用我编译的同一个 dll 并将其部署到另一个环境时,它总是显示为 false(似乎永远无法工作)。

有什么想法吗?预处理器指令是否从构建它们的 DLL 中继承?这意味着只要我的 dll 是使用添加符号的新配置构建的,那么它应该被设置,不是吗? 是否需要结转其他任何东西才能使其正常工作?我以为它只是 DLL。

谢谢!

【问题讨论】:

  • 预处理器指令在编译之前被处理。如果您需要在运行时测试条件,请使用普通的if
  • 是的,但是要确认,如果我选择 TEST,构建 dll,然后部署,它绝对应该设置为使用 TEST,不是吗?

标签: c# asp.net visual-studio visual-studio-2012 webforms


【解决方案1】:

您很可能使用了错误的 DLL 副本。

条件语句在编译时进行评估,IL 不包括“if-def”输出的分支。您可以使用任何反编译器验证编译后的 DLL 中实际包含的内容,例如 ILSpy 甚至 ILDasm(如果您只能使用 .Net/VS 附带的工具)。

请注意,如果您使用conditional attributes,它们会出现在已编译的代码中,并且使用它们注释的调用方法将根据引用您的 DLL 的项目进行编译(例如,请参阅如何标记 Debug.Trace)。请参阅#if DEBUG vs. Conditional("DEBUG") 了解更多信息。

【讨论】:

  • 嗯,但是我直接从我的 bin 文件夹中获取了带有今天时间戳的 DLL,然后将其复制过来,但它不起作用。我还应该做什么?
  • @user3379785 查看 DLL 的 IL - 不可能远程确定您是否使用正确的 DLL 以及它是如何实际编译的。
  • 嘿,谢谢,所以我使用了 ILSpy,它似乎设置为 true(所以它是正确的并且应该可以工作)。还有其他想法吗?
  • @user3379785 假设视图中的 isTestSet 实际上来自 DLL(并且您已经检查了 app 文件夹中的 DLL) - 否。
  • 好的,谢谢 :) 感谢您的反馈,我会在别处解决问题!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-22
  • 2020-09-24
  • 1970-01-01
  • 1970-01-01
  • 2016-06-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多