<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>3f blog &#187; .net</title>
	<atom:link href="http://blog.soluciones3f.com.ar/tag/net/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.soluciones3f.com.ar</link>
	<description>Experiencias compartidas</description>
	<lastBuildDate>Tue, 01 Nov 2011 18:08:49 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>Sobre la palabra reservada &#8220;using&#8221; en C#</title>
		<link>http://blog.soluciones3f.com.ar/2010/08/19/sobre-la-palabra-reservada-using-en-c/</link>
		<comments>http://blog.soluciones3f.com.ar/2010/08/19/sobre-la-palabra-reservada-using-en-c/#comments</comments>
		<pubDate>Fri, 20 Aug 2010 01:14:28 +0000</pubDate>
		<dc:creator>fernando</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[programacion]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[disposable]]></category>
		<category><![CDATA[keyword]]></category>
		<category><![CDATA[palabra clave]]></category>
		<category><![CDATA[palabra reservada]]></category>
		<category><![CDATA[recursos]]></category>
		<category><![CDATA[reserved word]]></category>
		<category><![CDATA[using]]></category>

		<guid isPermaLink="false">http://blog.soluciones3f.com.ar/?p=607</guid>
		<description><![CDATA[Antes que nada perdón por el título, me dolió muchísimo escribir palabra reservada en lugar de escribir como estamos más acostumbrados keyword en argentina. Pero decidí utilizar su traducción porque después de todo este es un blog en español y mucha gente que lo consulta acostumbra a utilizar únicamente español en sus consultas. Hecho este [...]]]></description>
			<content:encoded><![CDATA[<p>Antes que nada perdón por el título, me dolió muchísimo escribir <em>palabra reservada</em> en lugar de escribir como estamos más acostumbrados <em>keyword </em>en argentina. Pero decidí utilizar su traducción porque después de todo este es un blog en español y mucha gente que lo consulta acostumbra a utilizar únicamente español en sus consultas.</p>
<p>Hecho este descargo, el motivo fue que hice un pequeño programita que escribía en un archivo, para ello me basé en la ayuda de Microsoft que utilizaba el keyword using de la siguiente manera</p>
<pre class="brush: csharp; title: ; notranslate">
using(StreamWriter w = new StreamWriter(&quot;BuildAll.sql&quot;)) {
// hago lo que quiero con el writer
}
</pre>
<p>Un poco tardíamente (ya que esto existe hace varios años)  me surgió la duda de para que servía realmente using. El saber popular dice que es para asegurarse que se liberan los recursos que podrían haberse reservado, pero esta explicación no era suficiente para mi y quería saber realmente como funcionaba.</p>
<p>Consultando en internet encontré en CodeProject el artículo titulado <a href="http://www.codeproject.com/KB/cs/CSharp_using.aspx" target="_blank">The &#8220;using&#8221; Keyword in C#</a> en el cual el autor comenta  su investigación sobre el asunto. Recomiendo a cualquiera que le interese un poco el funcionamiento interno de las cosas que le pegue una leida a ese artículo.</p>
<p>En resumen lo que dice es que lo que hace este keyword es crear un bloque try..finally, en donde como última acción se realiza un dispose del objeto que figura en el parámetro del using. Y que si la clase que se esta intentando limpiar no implementa correctamente la interfaz IDisposable no sirve de mucho.</p>
<p>En fin, esto más que nada me pareció una curiosidad que a otros les parecio interesante que escribiera aquí.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.soluciones3f.com.ar/2010/08/19/sobre-la-palabra-reservada-using-en-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Evitar el acceso con navegadores viejos (httpModules .NET)</title>
		<link>http://blog.soluciones3f.com.ar/2008/11/08/evitar-el-acceso-con-navegadores-viejos-httpmodules-net/</link>
		<comments>http://blog.soluciones3f.com.ar/2008/11/08/evitar-el-acceso-con-navegadores-viejos-httpmodules-net/#comments</comments>
		<pubDate>Sat, 08 Nov 2008 06:02:49 +0000</pubDate>
		<dc:creator>fafa</dc:creator>
				<category><![CDATA[Sin categoría]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[httpmodule]]></category>
		<category><![CDATA[microsoft]]></category>

		<guid isPermaLink="false">http://blog.soluciones3f.com.ar/?p=169</guid>
		<description><![CDATA[La gente de Microsoft, en su afán de mejorar la arquitectura de su tecnología web, implementó algo nuevo conocido como httpModules. Obviamente, no es algo nuevo, pero si es algo que se está comenzando a usar hace muy poco tiempo. La propuesta es muy similar a lo que Java llama Filtros. Básicamente todo request que [...]]]></description>
			<content:encoded><![CDATA[<p>La gente de Microsoft, en su afán de mejorar la arquitectura de su tecnología web, implementó algo <em>nuevo</em> conocido como httpModules. Obviamente, no es algo nuevo, pero si es algo que se está comenzando a usar hace muy poco tiempo.</p>
<p>La propuesta es muy similar a lo que Java llama Filtros. Básicamente todo <em>request</em> que llegue al servidor, pasaría por estos httpModules quienes harían su trabajo y toman decisiones. Para aquellos que quieren entender de qué estoy hablando en 5 minutos, la idea es <strong>muy simple</strong> un patrón Observer. Lo que hay que hacer es:</p>
<ol>
<li>Definir estos módulos (así los bautizó MS) deben estar definidas para <em>escuchar</em> un cierto evento que ocurra con el servidor. Por ejemplo, GET (para ver todo los eventos que se pueden atrapar, ver <a href="http://support.microsoft.com/kb/307996">este link</a>)</li>
<li>Modificar el web.config para agregar ese <em>módulo</em> a la configuración de la aplicación web.</li>
<li>Tener precaución, porque este filtro actuará sobre <strong>todo acceso</strong> que se realice con el servidor y nos podría ocasionar problemas si queremos redirigir a una página de error, por ejemplo.</li>
</ol>
<p>En nuestro caso, necesitábamos evitar que navegadores viejos ingresaran a un sitio. Tan simple como eso. Tuvimos que tomar algunas precauciones, pero luego de mucha búsqueda encontramos una solucíon muy satisfactoria con los módulos (y claramente superior a cualquier <em>chanchada</em>). Aquí les adjunto el código para que lo vean (como dice el dicho: <em>El camino se hace rodando</em>)</p>
<p><span id="more-169"></span></p>
<pre lang="csharp" line="1">
using System;
using System.Web;
using log4net;

namespace modulos
{
	public class OldBrowserModule : IHttpModule
	{
		#region IHttpModule Members

		public void Init(HttpApplication application)
		{
			application.BeginRequest += new EventHandler(OnBeginRequest);
		}
		public void Dispose() { }

		#endregion

		public delegate void MyEventHandler(Object s, EventArgs e);
		private MyEventHandler _eventHandler = null;

		public event MyEventHandler MyEvent
		{
			add { _eventHandler += value; }
			remove { _eventHandler -= value; }
		}

		private bool applyFilter(HttpRequest req)
		{
			bool retVal = true;
			retVal != !(req.FilePath.IndexOf("UnsupportedBrowserGlobal.aspx") > 0);
			retVal != req.FilePath.EndsWith(".aspx");
			return retVal;

		}

		public void OnBeginRequest(Object s, EventArgs e)
		{
			HttpApplication app = (HttpApplication)s;
			HttpRequest req = app.Context.Request;
			if (applyFilter(req))
			{
				if (req.Browser.Browser.Equals("IE") &#038;&#038; req.Browser.MajorVersion < 6)
				{
					app.Response.Redirect("~/UnsupportedBrowserGlobal.aspx");
				}
			}
		}

	}
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.soluciones3f.com.ar/2008/11/08/evitar-el-acceso-con-navegadores-viejos-httpmodules-net/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Membership Provider y Application Name</title>
		<link>http://blog.soluciones3f.com.ar/2008/04/08/membership-provider-y-application-name/</link>
		<comments>http://blog.soluciones3f.com.ar/2008/04/08/membership-provider-y-application-name/#comments</comments>
		<pubDate>Tue, 08 Apr 2008 16:16:31 +0000</pubDate>
		<dc:creator>fernando</dc:creator>
				<category><![CDATA[programacion]]></category>
		<category><![CDATA[.net]]></category>

		<guid isPermaLink="false">http://blog.soluciones3f.com.ar/?p=41</guid>
		<description><![CDATA[Algo muy Microsoft nos ha pasado hoy: al hacer un deploy de una aplicación en un entorno de test (montado en un IIS) dejaron de funcionar los usuarios. Era necesario hacer que los usuarios se mantuvieran tal cual estaban en el entorno de desarrollo, entonces esta contingencia nos ocasionó un problema. Es muy importante la [...]]]></description>
			<content:encoded><![CDATA[<p>Algo muy Microsoft nos ha pasado hoy: al hacer un deploy de una aplicación en un entorno de test (montado en un IIS) dejaron de funcionar los usuarios. Era necesario hacer que los usuarios se mantuvieran tal cual estaban en el entorno de desarrollo, entonces esta contingencia nos ocasionó un problema.</p>
<p>Es muy importante la confiabilidad de los datos en la base de datos. Recordemos que el <a href="http://msdn2.microsoft.com/en-us/library/f1kyba5e.aspx">Membership Provider </a>de .NET usa unas tablas en el servidor específicamente para su propio funcionamiento.</p>
<p>Lo que pasó fue que el Membership Provider se asocia con un Application Name, y este nombre, si no se especifica, se calcula. Y la forma de calcularlo del IIS es diferente a la del <a href="http://msdn2.microsoft.com/en-us/library/58wxa9w5(VS.80).aspx">ASP.NET Development Server</a>.</p>
<p>Por tal motivo, es siempre bueno recordar que hay que especificar puntualmente cual es el nombre de la aplicación, para que despues, un movimiento de servidor u otro cambio no afecte en nada al sistema.</p>
<p>Esto lo aprendí de <a href="http://weblogs.asp.net/scottgu/archive/2006/04/22/Always-set-the-_2200_applicationName_2200_-property-when-configuring-ASP.NET-2.0-Membership-and-other-Providers.aspx">ScottGu&#8217;s Blog </a>en donde también explica como se especifica este nombre muy facilmente.</p>
<p>En resumen, el Membership provider debe quedar de la siguiente manera.</p>
<pre lang="xml">
<membership>
<providers>
        <add .... applicationName = "/" />
    </providers>
</membership></pre>
<p>Algo similar se debe hacer con el Role Provider si es que se emplea uno.</p>
<p>Yo usé como nombre &#8220;/&#8221; porque ese es el nombre de applicacion que ya tenía anteriormente, pero en forma implícita. Sería recomendable usar algún otro nombre, para de esa manera poder tener tal vez varias aplicaciones corriendo sobre la misma base de datos, y con permisos diferentes.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.soluciones3f.com.ar/2008/04/08/membership-provider-y-application-name/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>CompositeControl contenido en un tag Div en lugar de Span</title>
		<link>http://blog.soluciones3f.com.ar/2008/04/06/compositecontrol-contenido-en-un-tag-div-en-lugar-de-spam/</link>
		<comments>http://blog.soluciones3f.com.ar/2008/04/06/compositecontrol-contenido-en-un-tag-div-en-lugar-de-spam/#comments</comments>
		<pubDate>Sun, 06 Apr 2008 07:20:51 +0000</pubDate>
		<dc:creator>fernando</dc:creator>
				<category><![CDATA[programacion]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[CompositeControl]]></category>
		<category><![CDATA[WebControl]]></category>

		<guid isPermaLink="false">http://blog.soluciones3f.com.ar/?p=39</guid>
		<description><![CDATA[Si uno observa mi post anterior, podrá apreciar que le paso al constructor de WebControl un parámetro HtmlTextWriterTag que le indica al control, que tag debe emplear a circunscribir todos los demás controles. Sin embargo, si heredo de CompositeControl, no tengo esa opción de pasarle al constructor un parámetro, y por default simpre usará un [...]]]></description>
			<content:encoded><![CDATA[<p>Si uno observa mi post anterior, podrá apreciar que le paso al constructor de WebControl un parámetro HtmlTextWriterTag que le indica al control, que tag debe emplear a circunscribir todos los demás controles.</p>
<p>Sin embargo, si heredo de CompositeControl, no tengo esa opción de pasarle al constructor un parámetro, y por default simpre usará un Span.</p>
<p>Si yo quiero que mi clase heredada de CustomControl tenga un tag diferente al div, deberé sobrecargar la propiedad TagKey, como hago en este ejemplo para que mis controles estén contenidos en un tag Div.</p>
<pre lang="c#">public class FiltersControl : CompositeControl
{
    ///
<summary>
    /// Envolvemos el control en un tag Div
    /// </summary>

    protected override HtmlTextWriterTag TagKey
    {
        get
        {
            return HtmlTextWriterTag.Div;
        }
    }
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.soluciones3f.com.ar/2008/04/06/compositecontrol-contenido-en-un-tag-div-en-lugar-de-spam/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>.Net, Dynamic Controls, WebControls y ViewState</title>
		<link>http://blog.soluciones3f.com.ar/2008/04/06/net-dynamic-controls-webcontrols-y-viewstate/</link>
		<comments>http://blog.soluciones3f.com.ar/2008/04/06/net-dynamic-controls-webcontrols-y-viewstate/#comments</comments>
		<pubDate>Sun, 06 Apr 2008 06:34:58 +0000</pubDate>
		<dc:creator>fernando</dc:creator>
				<category><![CDATA[programacion]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[CompositeControl]]></category>
		<category><![CDATA[Control]]></category>
		<category><![CDATA[INamingContainer]]></category>
		<category><![CDATA[Interfaz marcador]]></category>
		<category><![CDATA[Marker interface]]></category>
		<category><![CDATA[ViewState]]></category>
		<category><![CDATA[WebControl]]></category>

		<guid isPermaLink="false">http://blog.soluciones3f.com.ar/?p=38</guid>
		<description><![CDATA[Para un proyecto necesito hacer un &#8220;Custom Control&#8221; (tambien llamados a veces Server Controls o WebControls) que sea una composición de controles generados dinamicamente porque no puedo saber a priori ni la cantidad ni el tipo de controles que necesitaré. Además necesitaba que mantuvieran, estos controles dinámicos, el viewstate. Me tropecé con un montón de [...]]]></description>
			<content:encoded><![CDATA[<p>Para un proyecto necesito hacer un &#8220;Custom Control&#8221; (tambien llamados a veces Server Controls o WebControls) que sea una composición de controles generados dinamicamente porque no puedo saber a priori ni la cantidad ni el tipo de controles que necesitaré. Además necesitaba que mantuvieran, estos controles dinámicos, el viewstate.</p>
<p>Me tropecé con un montón de trabas, así que en lugar de intentar mi problema original, comencé con casos muchos mas simples para intentar apuntar a cada problema que tenía específico. El más molesto de todos ellos era que el ViewState se perdía en cada postback.</p>
<p>Originalmente mi clase de prueba, que agregaba dos textbox y un botón para testear el postback era así:</p>
<pre lang="c#">
public class FiltersControl : WebControl
{
    public FiltersControl() : base(HtmlTextWriterTag.Div) { }

    protected override void CreateChildControls()
    {
        TextBox text1 = new TextBox();
        TextBox text2 = new TextBox();

        Button button = new Button();
        button.Text = "Postback!";

        Controls.Add(text1);
        Controls.Add(text2);
        Controls.Add(button);
    }
}</pre>
<p>Pero fallaba inmediatamente, sin embargo si lo heredaba de CompositeControl funcionaba perfectamente. Gracias a <a href="http://www.aisto.com/roeder/dotnet/">Lutz Roeder&#8217;s Reflector</a> e investigando como funcionaba CompositeControl llegué a la conclusión que agregando únicamente la <a href="http://msdn2.microsoft.com/es-ar/library/system.web.ui.inamingcontainer(VS.80).aspx">interfaz marcador INamingContainer</a> se solucionaban todos los problemas, al menos en ese código tan simple.</p>
<p>Así que el siguiente código funciona como uno esperaría, y se puede apreciar que es idéntico al anterior, pero esta vez la clase tiene una interfaz.</p>
<pre lang="c#">
public class FiltersControl : WebControl, INamingContainer
{
    public FiltersControl() : base(HtmlTextWriterTag.Div) { }

    protected override void CreateChildControls()
    {
        TextBox text1 = new TextBox();
        TextBox text2 = new TextBox();

        Button button = new Button();
        button.Text = "Postback!";

        Controls.Add(text1);
        Controls.Add(text2);
        Controls.Add(button);
    }
}</pre>
<p>Moraleja, si implementan un control, que contiene otros controles, aún cuando saben que no habrá conflictos de nombres, o heredan de CompositeControl o lo hacen de Control (o alguna clase que herede) y marcan la clase con la interfaz INamingConteiner para no tener problemas con el ViewState</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.soluciones3f.com.ar/2008/04/06/net-dynamic-controls-webcontrols-y-viewstate/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Diferencia entre el operador == y el método Equals() en C#</title>
		<link>http://blog.soluciones3f.com.ar/2008/03/29/diferencia-en-el-operador-y-el-metodo-equals-en-c/</link>
		<comments>http://blog.soluciones3f.com.ar/2008/03/29/diferencia-en-el-operador-y-el-metodo-equals-en-c/#comments</comments>
		<pubDate>Sat, 29 Mar 2008 20:39:12 +0000</pubDate>
		<dc:creator>fernando</dc:creator>
				<category><![CDATA[programacion]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[==]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[Equals]]></category>
		<category><![CDATA[IList.Remove]]></category>

		<guid isPermaLink="false">http://blog.soluciones3f.com.ar/2008/03/29/diferencia-en-el-operador-y-el-metodo-equals-en-c/</guid>
		<description><![CDATA[C# es un bonito lenguaje que soporta operator overloading (sobrecarga de operadores) entre otras cosas. También tiene en la clase Object, de la cual heredan todas las otras clases, un método llamado Equals. El problema que me surgió hoy, fue que necesitaba utilizar el método IList.Remove() pasándole un objeto pero para mi sorpresa no eliminaba [...]]]></description>
			<content:encoded><![CDATA[<p>C# es un bonito lenguaje que soporta <a href="http://en.wikipedia.org/wiki/Operator_overloading"><em>operator overloading</em></a> (sobrecarga de operadores) entre otras cosas. También tiene en la clase Object, de la cual heredan todas las otras clases, un método llamado Equals.</p>
<p>El problema que me surgió hoy, fue que necesitaba utilizar el método <a href="http://msdn2.microsoft.com/es-es/library/system.collections.ilist.remove(VS.80).aspx">IList.Remove() </a>pasándole un objeto pero para mi sorpresa no eliminaba nada. Entonces comenzando a investigar encontré el método Equals() y la sobrecarga del operador == y estas son las conclusiones a las que llegué.</p>
<p><span id="more-25"></span></p>
<p>Tanto Equals() como operator== tienen por default la misma implementación. O sea las siguientes expresiones son equivalentes, si no redefino ni el método Equals ni el operador igual.</p>
<pre lang="c#">
o1  == o2;
o1.Equals(o2);</pre>
<p>¿Y como es la comparación que realizan? Simplemente una comparación de referencias (punteros para los mas vejetes como yo) Si dos objetos representan lo mismo, pero son instancias diferentes, y no sobrecarga ni el opeardor == ni Equals, entonces en cualquier comparación serán diferentes.</p>
<p>Tal vez con un ejemplo se aprecie mejor.Imaginemos que tenemos la clase NumeroComplejo que su constructor requiere dos parámetros: el primero la parte real, y el segundo la parte imaginaria. Entonces el siguiente código dirá dos veces que son números diferentes a pesar de ser conceptualmente el mismo numero.</p>
<pre lang="c#">
NumeroComplejo num1 = new NumeroComplejo(1,2);
NumeroComplejo num2 = new NumeroComplejo(1,2);

Console.WriteLine(num1 == num2);
Console.WriteLine(num1.Equals(num2));</pre>
<p>Esto se debe a que tanto == como Equals comparan la instancia, sin saber nada de su contenido. Ni siquiera hacen una comparación bit a bit, así que como son objeto diferentes, la comparación dice que lo son.</p>
<p>Obviamente, a nosotros nos convendría que digan que son iguales, no es muy intuitivo ver que código que básicamente dice if(1==1) no se ejecute, o en mi caso, sabiendo que una lista tenía un objeto especifico, llamar al método Remove con un objeto conceptualmente igual y que no elimine nada.</p>
<p>Entonces. ¿Que método debía sobrecargar? En algunos lugares leí que todos, pero no me convencía ese enfoque. Después de todo alguna diferencia deben tener, sino no tendría sentido que existan los dos. Por tal motivo seguí investigando y encontré en el lugar mas obvio, la <a href="http://msdn2.microsoft.com/es-es/library/bsc2ak47(VS.80).aspx">msdn de microsoft</a>, algunos indicios que me indicaron lo siguiente.</p>
<ol>
<li>Ni microsoft sabe bien la diferencia</li>
<li>Si es un tipo de valor, efectivamente recomiendan sobrecargar <strong>todos</strong></li>
<li>Si es un tipo de referencia, se debe sobrecargar Equals</li>
<li>Todos concuerdan que si se redefine Equals, hay que sobrecargar GetHashCode, y si se redefine el operador == se debe sobrecargar el operador !=</li>
</ol>
<p>O sea, cuando la clase es un numero complejo, o algo en que haga sentido sumar, restar y operar en general, entonces debería sobrecargar todos los operadores porque representa un valor&#8230; en cambio si fuera un objeto de clase Persona, lo correcto sería sobrecargar solo Equals() y utilizar, asimismo Equals() cuando se quieren comparar por su valor.</p>
<p>Admito que es una linea bastante delgada, pero creo que esa es la idea, lo cual no sería raro ya que se parece mucho también a la misma dualidad que hay en Java.</p>
<p>En fin, mi caso puntual hoy era un objeto de clase Requerimiento, por lo cual redefiní el método Equals() y magicamente mi IList comenzó a eliminar objetos. Lo cual significa que esta implementada usando el método Equals en lugar del operador== y solo espero todas las demás clases tengan el mismo comportamiento.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.soluciones3f.com.ar/2008/03/29/diferencia-en-el-operador-y-el-metodo-equals-en-c/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Winforms y DesignMode</title>
		<link>http://blog.soluciones3f.com.ar/2008/02/28/winforms-y-designmode/</link>
		<comments>http://blog.soluciones3f.com.ar/2008/02/28/winforms-y-designmode/#comments</comments>
		<pubDate>Thu, 28 Feb 2008 21:26:23 +0000</pubDate>
		<dc:creator>fernando</dc:creator>
				<category><![CDATA[programacion]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[DesignMode]]></category>
		<category><![CDATA[herencia]]></category>
		<category><![CDATA[WinForms]]></category>

		<guid isPermaLink="false">http://blog.soluciones3f.com.ar/?p=9</guid>
		<description><![CDATA[Hoy, día en que se cortó la luz la mayor parte del tiempo, aparentemente me hice un ratito para trabajar un poquito en net. Descubrí que no siempre el atributo DesignMode funciona como se piensa, asi que lo que esperaba fuera un problemita simple y rapido de solucionar, resulto en una invetigación en internet de [...]]]></description>
			<content:encoded><![CDATA[<p>Hoy, día en que se cortó la luz la mayor parte del tiempo, aparentemente me hice un ratito para trabajar un poquito en net.</p>
<p>Descubrí que no siempre el atributo DesignMode funciona como se piensa, asi que lo que esperaba fuera un problemita simple y rapido de solucionar, resulto en una invetigación en internet de como hacer mi propio DesignMode que sea confiable.</p>
<p>Aparentemene el problema se debe a que DesignMode solo informa si el control/formulario que se esta editando actualmente esta en tiempo de diseño, pero si es parte de una herencia, y es el padre el que necesita el DesignMode, a este le dice que no esta en diseño (lo cual es entre comillas cierto, ya que no es el padre el que se esta editando, sino el hijo pero genera conflictos y exceptions igual)</p>
<p>En fin, en internet encontré varias formas, tal vez todas igual de válidas y efectivas, pero al fin y al cabo la que yo implementé (lo cual no significa que sea la mejor) es la que figura en el blog de <a href="http://devlicio.us/blogs/derik_whittaker/archive/2006/09/25/Determining-if-the-.Net-IDE-is-in-Design-Mode.aspx">Derik Whittaker</a></p>
<p>Este  método consiste en definir un nuevo método llamado IsInDesignMode (que yo agregé a una clase propia de la cual heredan todos mis formularios) que realiza dos checkeos para determinar si estamos en la IDE o no.</p>
<p>El primer chequeo consiste en el clásico Designtime, si este retorna false, hace el segundo chequeo (si ya este retornó true no hace falta) El segundo chequeo es ver cual es el nombre del proceso que se está ejecutando. Si es DEVENV estamos dentro de la IDE, por lo tanto en tiempo de diseño.</p>
<p>Copio aquí el código, pero para mayores referencias aconsejo ver su <a href="http://devlicio.us/blogs/derik_whittaker/archive/2006/09/25/Determining-if-the-.Net-IDE-is-in-Design-Mode.aspx">blog </a></p>
<pre lang="csharp">
public static bool IsInDesignMode()
{
	bool returnFlag = false;
#if DEBUG
	if ( System.ComponentModel.LicenseManager.UsageMode ==</pre>
<pre lang="csharp">		System.ComponentModel.LicenseUsageMode.Designtime )
	{
		returnFlag = true;
	}
	else if ( Process.GetCurrentProcess().ProcessName.ToUpper().Equals( "DEVENV" ) )
	{
		returnFlag = true;
	}
#endif
	return returnFlag;
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.soluciones3f.com.ar/2008/02/28/winforms-y-designmode/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Build number en .Net</title>
		<link>http://blog.soluciones3f.com.ar/2008/02/28/build-number-en-net/</link>
		<comments>http://blog.soluciones3f.com.ar/2008/02/28/build-number-en-net/#comments</comments>
		<pubDate>Thu, 28 Feb 2008 13:50:02 +0000</pubDate>
		<dc:creator>fernando</dc:creator>
				<category><![CDATA[programacion]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[build number]]></category>
		<category><![CDATA[visual studio]]></category>

		<guid isPermaLink="false">http://blog.soluciones3f.com.ar/?p=8</guid>
		<description><![CDATA[Hoy antes de ir a un cliente, me acordé que teníamos un número de versión que incrementamos a mano. Entonces antes de incrementarlo a mano, pensé, si había alguna forma de que se haga automáticamente con cada Build. No pequeña fue mi desilusión al advertir que no es trivial el hacer esto, en especial cuando [...]]]></description>
			<content:encoded><![CDATA[<p>Hoy antes de ir a un cliente, me acordé que teníamos un número de versión que incrementamos a mano. Entonces antes de incrementarlo a mano, pensé, si había alguna forma de que se haga automáticamente con cada Build.</p>
<p>No pequeña fue mi desilusión al advertir que no es trivial el hacer esto, en especial cuando Vb6 recuerdo que tenía algo, rudimentario, pero útil que hacía esto mismo.</p>
<p>En fin, buscando en internet encontré varias formas de conseguir este objetivo usando macros o mini programitas. Supongo que cuando tenga más tiempo usaré algunas de ellas.</p>
<p>Les dejo, entonces, dos sites con información de este tema <a href="http://weblogs.asp.net/egarmon/archive/2003/12/03/41101.aspx">http://weblogs.asp.net/egarmon/archive/2003/12/03/41101.aspx</a> y <a href="http://www.codeproject.com/KB/macros/VSBuildNumberAutomation.aspx">http://www.codeproject.com/KB/macros/VSBuildNumberAutomation.aspx</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.soluciones3f.com.ar/2008/02/28/build-number-en-net/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

