2010-12-08 3 views
0

Я новичок в C#/Asp.net World, Недавно я наткнулся на #if DEBUG PreProcessor, но даже после просмотра сообщений на Stack Over flow и веб-сайте MSDN и других блогах, а также я не способный заставить его работать.#if PreProcessor in C#

Я создаю небольшой сайт. Я реализую DataLayer, добавив новый проект в решение. В Datalayer я проверяю параметры, переданные в хранимую процедуру.

Итак, цель - напечатать параметры, переданные при запуске приложения в режиме отладки, и когда приложение запускается в режиме выпуска, оно не должно показывать параметры.

Любая помощь может быть оценена.

Благодаря

#define DEBUG 

using System; 
using System.Data; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using TestWebsite.DataLayer.BussinessObjects; 
using Microsoft.Practices.EnterpriseLibrary.Data; 
using Microsoft.Practices.EnterpriseLibrary.Data.Sql; 
using System.Data.Common; 

namespace TestWebsite.DataLayer 
{ 
    public class StatesManager 
    { 
     public ICollection<States> getAll(States statesObj) 
     { 
      List<object> parameters = new List<object>(); 
      List<States> scol = new List<States>(); 
      try 
      { 
       parameters.Add(statesObj.State); 
       parameters.Add(statesObj.Abbreviation); 
       parameters.Add(statesObj.StartRowIndex); 
       parameters.Add(statesObj.MaximumRowsCount); 
       parameters.Add(statesObj.SortExpression); 
       parameters.Add(statesObj.SortDirection); 

#if DEBUG 
       System.Web.HttpContext.Current.Response.Write("State =" + statesObj.State + ",<br/>"); 
       System.Web.HttpContext.Current.Response.Write("Abbreviation =" + statesObj.Abbreviation + ",<br/>"); 
       System.Web.HttpContext.Current.Response.Write("StartRowIndex =" + statesObj.StartRowIndex.ToString() + ",<br/>"); 
       System.Web.HttpContext.Current.Response.Write("MaximumRowsCount =" + statesObj.MaximumRowsCount.ToString() + ",<br/>"); 
       System.Web.HttpContext.Current.Response.Write("SortExpression =" + statesObj.SortExpression + ",<br/>"); 
       System.Web.HttpContext.Current.Response.Write("SortDirection =" + statesObj.SortDirection.ToString() + "<br/>"); 
#endif 

       object[] paramArray = parameters.ToArray(); 

       SqlDatabase db = new SqlDatabase(ConnectionManager.ConnectionString); 
       DbCommand dbCommand = db.GetStoredProcCommand("GetAllStates", paramArray); 
       IDataReader reader = db.ExecuteReader(dbCommand); 

       while (reader.Read()) 
       { 
        States sreader = new States(); 
        sreader.State = (string)reader[reader.GetOrdinal("State")]; 
        sreader.Abbreviation = (string)reader[reader.GetOrdinal("Abbreviation")]; 
        sreader.IsActive = (bool)reader[reader.GetOrdinal("IsActive")]; 
        sreader.RowNumber = (long)reader[reader.GetOrdinal("RowNo")]; 
        sreader.StateID = (int)reader[reader.GetOrdinal("StateID")]; 

        scol.Add(sreader); 
        sreader = null; 
       } 
       reader.Dispose(); 
      } 
      catch (Exception ex) 
      { 
       throw ex; 
      } 
      finally { parameters = null; } 
      return scol; 
     } 
    } 
} 
+2

Пожалуйста, покажите нам свой код, особенно фрагмент препроцессора. – 2010-12-08 16:49:11

+0

Покажите нам код, чтобы мы могли видеть, что «не работает». – 2010-12-08 16:49:41

+0

Является ли ваш Shift ключ немного биполярным сегодня из всего, что C# кодирования? – BoltClock 2010-12-08 16:51:54

ответ

0

правой кнопкой мыши проект в обозревателе решений, нажмите кнопку Свойства. Перейдите на вкладку «Сборка» и выберите свою конфигурацию отладки в раскрывающемся меню. Убедитесь, что установлен флажок «Определить константу DEBUG».

Сделайте то же самое для конфигурации Release, но убедитесь, что «Define DEBUG Constant» не установлен.

Это гарантирует, что все

#if DEBUG 

директивы работать, как вы ожидаете.

EDIT: Поскольку вы используете проект веб-сайта, перейдите в файл web.config, в разделе system.web и найти или добавить < компиляции отладки = «ложных»/> узел. Этот атрибут будет включать и выключать константу DEBUG.

+0

Привет, Стив, Когда я нажимаю правой кнопкой мыши Проект из обозревателя решений перейдите в «Свойства». Я не вижу «Определить константу отладки» или другие вещи, которые вы говорите в сообщении выше? Я использую ASP.net3.5 и разрабатываю проект WebSite – shankbond 2010-12-09 07:46:06

3

Возможно, вы пытаетесь использовать #if на странице ASPX.

Препроцессор поддерживается только в источнике C#.

Вместо этого, вы можете использовать обычный if:

<% if (HttpContext.Current.IsDebuggingEnabled) { %> 
    ... 
<% } %> 

Это свойство отражает наличие <compilation debug="true"> в Web.config.

Вы можете быть в состоянии написать

<% 
#if DEBUG %> 
    ... 
<% 
#endif%> 

(обратите внимание на новые строки), но я не думаю, что он будет работать.

0

Вы не можете использовать #if в своей разметке ASP.NET. Если вы используете код позади, вы можете сделать следующее в разметке:

<asp:PlaceHolder runat="server" ID="DebugOutput" EnableViewstate="false" Visible="false"> 
    <asp:Literal runat="server" ID="OutputValue" /> 
</asp:PlaceHolder> 

А в коде позади:

#if DEBUG 
    DebugOutput.Visible = true; 
    OutputValue.Text = "My output string"; 
#endif 

Вы можете использовать панель вместо заменителя, но панели имеют контроль state, даже если viewstate отключен, поэтому вы получите записи в viewstate для этой панели даже в коде выпуска.

0

Синтаксис мудрый - это то, что должен выглядеть блок «if».

#if DEBUG 
// do something that is debugish 
#endif 

Для того, чтобы это заявление на работу DEBUG должен быть «определен» вы можете сделать это в коде (не лучший способ) ...

#define DEBUG 

Или вы можете сделать это в вашем IDE, дважды щелкнув «Свойства» в проекте, а затем перейдите на вкладку «Скомпилировать». Убедитесь, что вы видите «Определить константу DEBUG».

В качестве альтернативы вашему решению вы можете использовать TraceSource вместо константы DEBUG.

How to: Use TraceSource and Filters with Trace Listeners

0

В ответ на отредактированном вопрос:

Вы пытаетесь написать к выходу в середине коде, до того, как ответ устанавливается.

Вы не можете этого сделать.

Вам необходимо передать информацию в представление ASPX и написать ее там, или использовать фактические функции отладки, такие как трассировка.