我所在的公司有 2 台服务器,1 台发布服务器和 1 台测试/调试服务器。我想限制发布服务器,使其只能运行编译为发布(未定义 DEBUG 常量)的代码。
这可能吗?如果可以,我该如何实现?我可以在 IIS 或 web.config 中设置它吗?
答案1
使用一个标志与另一个标志进行编译时,编译的程序集没有区别。名称“Debug”和“Release”纯粹是常规的。我假设您关心的设置是代码是否经过优化。这也是无法检测到的。
相反,正如@HABO 所建议的那样,答案是定义一个标志,该标志存在于开发人员的机器上,使调试代码可以接受。您可以使用以下简单的东西:
static class AssertProductionOptimized
{
private static bool checkCompleted = false;
private static bool isDeveloper = false;
private const string regPath = @"Software\My Awesome Software, Inc";
private const string regValue = "IsDeveloper";
[Conditional("DEBUG")]
public static void AssertOptimized()
{
if (checkCompleted)
{
isDeveloper = checkIfDeveloper();
checkCompleted = true;
}
if (!isDeveloper)
{
throw new InvalidOperationException(string.Format("Debug code running "
+ "on non-developer machine. Either build without DEBUG flag, or "
+ "add a DWORD named {1} with a value of 1 to HKLM\\{0}",
regPath, regValue));
}
}
private static void checkIfDeveloper()
{
RegistryKey hkKey = null;
try
{
hkKey = Registry.LocalMachine.OpenSubKey(regPath);
// if the key does not exist, we are not a developer
if (hkKey == null)
return false;
var hkValueObj = hkKey.GetValue(regValue);
return object.Equals(hkValueObj, 1);
}
catch (Exception ex)
{
throw new Exception("Exception occurred while checking developer status", ex);
}
finally
{
if (hkKey != null)
hkKey.Dispose();
}
}
}