<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://geeks.ms/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Burbujas en .NET : visual studio</title><link>http://geeks.ms/blogs/etomas/archive/tags/visual+studio/default.aspx</link><description>Etiquetas: visual studio</description><dc:language /><generator>CommunityServer 2008.5 SP1 (Build: 31106.3070)</generator><item><title>El problema de la WebGrid con VS2012RC y ASP.NET MVC4</title><link>http://geeks.ms/blogs/etomas/archive/2012/08/02/el-problema-de-la-webgrid-con-vs2012rc-y-asp-net-mvc4.aspx</link><pubDate>Thu, 02 Aug 2012 11:23:45 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:206357</guid><dc:creator>Eduard Tomàs i Avellana</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/etomas/rsscomments.aspx?PostID=206357</wfw:commentRss><comments>http://geeks.ms/blogs/etomas/archive/2012/08/02/el-problema-de-la-webgrid-con-vs2012rc-y-asp-net-mvc4.aspx#comments</comments><description>&lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;Nota:&lt;/strong&gt; Este post está basado en la versión RC de VS2012 y la versión RC de MVC4 y es posible (o eso espero, vaya!) que en la versión final no haya los problemas que este post menciona!&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Buenas! Coje un VS2102RC y crea un nuevo proyecto ASP.NET MVC4, con la plantilla “Basic”.&lt;/p&gt;  &lt;p&gt;Crea el HomeController, crea la acción Index y añádele un código tal como:&lt;/p&gt;  &lt;div id="codeSnippetWrapper" style="overflow:auto;cursor:text;font-size:8pt;border-top:silver 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right:silver 1px solid;border-bottom:silver 1px solid;padding-bottom:4px;direction:ltr;text-align:left;padding-top:4px;padding-left:4px;margin:20px 0px 10px;border-left:silver 1px solid;line-height:12pt;padding-right:4px;max-height:200px;width:97.5%;background-color:#f4f4f4;"&gt;   &lt;div id="codeSnippet" style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;     &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum1" style="color:#606060;"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; ActionResult Index()&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&lt;span id="lnum2" style="color:#606060;"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum3" style="color:#606060;"&gt;   3:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; data = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; List&amp;lt;dynamic&amp;gt;() { &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; { Name = &lt;span style="color:#006080;"&gt;&amp;quot;Edu&amp;quot;&lt;/span&gt;, Twitter = &lt;span style="color:#006080;"&gt;&amp;quot;eiximenis&amp;quot;&lt;/span&gt; } };&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&lt;span id="lnum4" style="color:#606060;"&gt;   4:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; View(data);&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum5" style="color:#606060;"&gt;   5:&lt;/span&gt; }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Finalmente crea la vista Index.cshtml:&lt;/p&gt;

&lt;div id="codeSnippetWrapper" style="overflow:auto;cursor:text;font-size:8pt;border-top:silver 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right:silver 1px solid;border-bottom:silver 1px solid;padding-bottom:4px;direction:ltr;text-align:left;padding-top:4px;padding-left:4px;margin:20px 0px 10px;border-left:silver 1px solid;line-height:12pt;padding-right:4px;max-height:200px;width:97.5%;background-color:#f4f4f4;"&gt;
  &lt;div id="codeSnippet" style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;
    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum1" style="color:#606060;"&gt;   1:&lt;/span&gt; @{&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&lt;span id="lnum2" style="color:#606060;"&gt;   2:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; grid = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; WebGrid(Model, &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; [] {&lt;span style="color:#006080;"&gt;&amp;quot;Name&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;Twitter&amp;quot;&lt;/span&gt;});&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum3" style="color:#606060;"&gt;   3:&lt;/span&gt; }&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&lt;span id="lnum4" style="color:#606060;"&gt;   4:&lt;/span&gt; @grid.GetHtml()&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Seguro que esperas ver una grid con las dos columnas y una fila no? ¡Pues no! Lo que verás es:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/etomas/image_5F00_789491CB.png"&gt;&lt;img title="image" style="border-top:0px;border-right:0px;border-bottom:0px;border-left:0px;display:inline;" border="0" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/etomas/image_5F00_thumb_5F00_0117F116.png" width="644" height="263" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Obtendrás el error “&lt;em&gt;CS0246: The type or namespace name &amp;#39;WebGrid&amp;#39; could not be found (are you missing a using directive or an assembly reference?)&lt;/em&gt;”.&lt;/p&gt;

&lt;p&gt;Si repites este mismo procedimiento pero cojes la plantilla “Empty” el código funcionará sin problemas :)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Y donde está el problema?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Pues eso me he estado preguntando un buen rato. Por supuesto antes de intentar hacer nada he usado el comodín de Google pero esta vez me ha fallado. La única referencia que he encontrado es un post en los blogs de ASP.NET (&lt;a href="http://forums.asp.net/t/1823940.aspx/1?MVC4+WebGrid+problem+in+View+Razor"&gt;http://forums.asp.net/t/1823940.aspx/1?MVC4+WebGrid+problem+in+View+Razor+&lt;/a&gt;) donde alguien más experimenta el problema pero no se llega a ninguna solución.&lt;/p&gt;

&lt;p&gt;Al final lo que he hecho para solucionar el problema ha sido:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Desde NuGet &lt;strong&gt;desinstalar&lt;/strong&gt; el paquete ASP.NET MVC4 RC 4.0.20505. Eso ha desinstalado también los paquetes Microsoft.AspNet.WebPages 2.0.20505.0 y Microsoft.AspNet.Razor 2.0.20505.0&lt;/li&gt;

  &lt;li&gt;Volver a instalar el paquete ASP.NET MVC4 RC 4.0.20505 desde NuGet. Me ha dado un error y ha hecho un rollback.&lt;/li&gt;

  &lt;li&gt;Intentar de nuevo volver a instalar el paquete ASP.NET MVC4 RC 4.0.20505. Ahora todo ha funcionado correctamente.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Después del tercer punto, la WebGrid ya funcionaba correctamente.&lt;/p&gt;

&lt;p&gt;Honestamente desconozco la causa, pero bueno… si alguien se encuentra con ello, ya lo sabe. Que pruebe esto a ver si le funciona! :)&lt;/p&gt;

&lt;p&gt;Un saludo!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=206357" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/etomas/archive/tags/visual+studio/default.aspx">visual studio</category><category domain="http://geeks.ms/blogs/etomas/archive/tags/asp.net+MVC/default.aspx">asp.net MVC</category></item><item><title>Cargar información de reflection sin cargar el assembly</title><link>http://geeks.ms/blogs/etomas/archive/2012/05/10/cargar-informaci-243-n-de-reflection-sin-cargar-el-assembly.aspx</link><pubDate>Thu, 10 May 2012 15:27:46 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:204954</guid><dc:creator>Eduard Tomàs i Avellana</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/etomas/rsscomments.aspx?PostID=204954</wfw:commentRss><comments>http://geeks.ms/blogs/etomas/archive/2012/05/10/cargar-informaci-243-n-de-reflection-sin-cargar-el-assembly.aspx#comments</comments><description>&lt;p&gt;Bueno… veamos un post rapidito. En un proyecto en el que he participado hemos estado personalizando Visual Studio a través de varios custom editors, plugins, packages y demás fauna que pulula por la selva de extensibilidad de Visual Studio.&lt;/p&gt;  &lt;p&gt;Estos editores, addines y demás necesitaban acceder a información de Reflection de la propia DLL que se estaba compilando. Teóricamente obtener la información es muy sencillo. Basta con obtener la ruta a la DLL que se está compilando:&lt;/p&gt;  &lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt;   &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; EnvDTE.&lt;span style="color:#2b91af;"&gt;DTE&lt;/span&gt; DTE&lt;/p&gt;    &lt;p style="margin:0px;"&gt;{&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;get&lt;/span&gt; { &lt;span style="color:blue;"&gt;return&lt;/span&gt; (EnvDTE.&lt;span style="color:#2b91af;"&gt;DTE&lt;/span&gt;)&lt;span style="color:#2b91af;"&gt;Package&lt;/span&gt;.GetGlobalService(&lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(EnvDTE.&lt;span style="color:#2b91af;"&gt;DTE&lt;/span&gt;)); }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;}&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; ObtenerRutaEnsamblado()&lt;/p&gt;    &lt;p style="margin:0px;"&gt;{&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;var&lt;/span&gt; project = DTE.ActiveDocument.ProjectItem.ContainingProject;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; project.Properties.Item(&lt;span style="color:#a31515;"&gt;&amp;quot;LocalPath&amp;quot;&lt;/span&gt;).Value.ToString() +&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; project.ConfigurationManager.ActiveConfiguration.Properties.Item(&lt;span style="color:#a31515;"&gt;&amp;quot;OutputPath&amp;quot;&lt;/span&gt;).Value.ToString();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;}&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; ObtenerNombreEnsamblado()&lt;/p&gt;    &lt;p style="margin:0px;"&gt;{&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;var&lt;/span&gt; project = DTE.ActiveDocument.ProjectItem.ContainingProject;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt;.Concat(ObtenerRutaEnsamblado(), project.Properties.Item(&lt;span style="color:#a31515;"&gt;&amp;quot;OutputFileName&amp;quot;&lt;/span&gt;).Value.ToString());&lt;/p&gt;    &lt;p style="margin:0px;"&gt;}&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;El método ObtenerNombreEnsamblado da la ruta física de la DLL que se está compilando. A partir de aquí, debería bastar con usar LoadAssembly, para cargar la DLL y listos. Pero por supuesto, si esto fuese así, esta entrada del blog no existiría :)&lt;/p&gt;  &lt;p&gt;El tema está en que cuando accedemos a un Assembly via Reflection, este assembly se carga en el CLR.&amp;#160; Y una vez un Assembly está cargado no puede ni cargarse de nuevo (para ver las modificaciones, por ejemplo, recordad que estamos cargando la propia DLL que el usuario está creando en VS) ni tampoco descargarse. Además el archivo físico se puede crear bloqueado (lo que en nuestro caso impedía que pudieses compilar el proyecto, ya que estaba bloqueado por el addin). Si alguno de vosotros está pensando en cargar el proyecto &lt;a href="http://msdn.microsoft.com/en-us/library/ms172331.aspx"&gt;“solo para Reflection”&lt;/a&gt;, que se olvide. Cargar un assembly “solo para Reflection” lo carga igual y tampoco se puede ni cargar de nuevo ni descargar.&lt;/p&gt;  &lt;p&gt;¿La solución? Bueno, pues utilizar un AppDomain nuevo. Para los que no lo sepáis los AppDomains son como “procesos” dentro del CLR. Un programa se ejecuta dentro de un AppDomain pero puede crear más AppDomains, del mismo modo que un proceso puede crear procesos hijos. Por supuesto la comunicación entre dos AppDomains se trata como comunicación interproceso: o a través de proxies (objetos MarshalByRef) o pasando objetos serializables. ¡Viva la vida!&lt;/p&gt;  &lt;p&gt;Al final, terminé con una clase AppDomainUtils, con métodos estáticos parecidos a los siguientes:&lt;/p&gt;  &lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt;   &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; Carga el tipo TObj en un AppDomain nuevo.&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; TObj DEBE ser MarshalByRef&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; TObj LoadFromType&amp;lt;TObj&amp;gt;(&lt;span style="color:#2b91af;"&gt;AppDomain&lt;/span&gt; appDomain)&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;var&lt;/span&gt; tokens = &lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(TObj).AssemblyQualifiedName.Split(&lt;span style="color:#a31515;"&gt;&amp;#39;,&amp;#39;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;var&lt;/span&gt; assName = tokens[1];&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;var&lt;/span&gt; typeName = tokens[0];&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;var&lt;/span&gt; obj = appDomain.CreateInstanceAndUnwrap(assName, typeName);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; (TObj)obj;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; Obtiene información (de tipo TR) de un System.Type.&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;typeparam name=&amp;quot;TR&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;Tipo de información que se devuelve. Debe ser Serializable&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/typeparam&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;typeparam name=&amp;quot;TU&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;Tipo de la clase que extrae la información a partir del System.Type&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/typeparam&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;param name=&amp;quot;fullName&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;Nombre del System.Type a cargar (con assembly incorporado)&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;param name=&amp;quot;locationPath&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;Ruta fisica real del assembly&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;La información extraída del System.Type&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; TR GetTypeInfo&amp;lt;TR, TU&amp;gt;(&lt;span style="color:blue;"&gt;string&lt;/span&gt; fullName, &lt;span style="color:blue;"&gt;string&lt;/span&gt; locationPath)&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;where&lt;/span&gt; TU : &lt;span style="color:#2b91af;"&gt;TypeLoader&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;var&lt;/span&gt; appDomain = &lt;span style="color:#2b91af;"&gt;AppDomain&lt;/span&gt;.CreateDomain(&lt;span style="color:#2b91af;"&gt;Guid&lt;/span&gt;.NewGuid().ToString());&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;var&lt;/span&gt; tloader = LoadFromType&amp;lt;TU&amp;gt;(appDomain);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;var&lt;/span&gt; result = tloader.LoadTypeInfo&amp;lt;TR&amp;gt;(fullName, locationPath);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;AppDomain&lt;/span&gt;.Unload(appDomain);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; result;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;}&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;La clase TypeLoader es como sigue:&lt;/p&gt;  &lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt;   &lt;p style="margin:0px;"&gt;&lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; Carga información de un tipo.&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;TypeLoader&lt;/span&gt; : &lt;span style="color:#2b91af;"&gt;MarshalByRefObject&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;{&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; Carga el tipo y extrae la información&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; TR LoadTypeInfo&amp;lt;TR&amp;gt;(&lt;span style="color:blue;"&gt;string&lt;/span&gt; fullName, &lt;span style="color:blue;"&gt;string&lt;/span&gt; locationPath)&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;var&lt;/span&gt; type = &lt;span style="color:#2b91af;"&gt;Type&lt;/span&gt;.GetType(fullName);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (type == &lt;span style="color:blue;"&gt;null&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;var&lt;/span&gt; tokens = fullName.Split(&lt;span style="color:#a31515;"&gt;&amp;#39;,&amp;#39;&lt;/span&gt;).Select(x =&amp;gt; x.Trim()).ToArray();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;var&lt;/span&gt; assFileName = tokens[1];&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;var&lt;/span&gt; assFileNameWithExtension = &lt;span style="color:blue;"&gt;string&lt;/span&gt;.Concat(assFileName.Trim(), &lt;span style="color:#a31515;"&gt;&amp;quot;.dll&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;var&lt;/span&gt; assembly = &lt;span style="color:#2b91af;"&gt;AssemblyLoader&lt;/span&gt;.CargarAssemblyDesdeByteArray(&lt;span style="color:#2b91af;"&gt;Path&lt;/span&gt;.Combine(locationPath, assFileNameWithExtension));&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;var&lt;/span&gt; typeName = tokens[0];&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; type = assembly.GetTypes().FirstOrDefault(x =&amp;gt; x.FullName == typeName);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; type != &lt;span style="color:blue;"&gt;null&lt;/span&gt; ? (TR)Select(type) : &lt;span style="color:blue;"&gt;default&lt;/span&gt;(TR);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; Este método recibe un Type y debe devolver la info que se necesita de dicho Type.&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; Este objeto DEBE ser serializable y debe ser una instancia (o casteable) de TR&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;protected&lt;/span&gt; &lt;span style="color:blue;"&gt;virtual&lt;/span&gt; &lt;span style="color:blue;"&gt;object&lt;/span&gt; Select(&lt;span style="color:#2b91af;"&gt;Type&lt;/span&gt; type) { &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:blue;"&gt;null&lt;/span&gt;; }&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;La idea es cargar un System.Type, extraer información de él y devolverla. Evidentemente esto debe hacerse en un AppDomain nuevo. El método GetTypeInfo lo que hace es crear este AppDomain nuevo y luego, dentro de este AppDomain crear una instancia de un objeto propio, de un tipo cualquiera TU, pero que TU derive de TypeLoader. Y llama al método LoadTypeInfo de este objeto propio. El método LoadTypeInfo (definido en la clase TypeLoader) es el método que:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Carga el assembly (usando un método propio que lo carga desde un array de bytes para asegurar que el fichero no se queda bloqueado. Simplemente lee todo el contenido del fichero en un byte[] y luego usa Assembly.Load pasándole este byte[]). &lt;/li&gt;    &lt;li&gt;Obtiene el tipo (System.Type) especificado. &lt;/li&gt;    &lt;li&gt;Llama al método Select que recibe un System.Type y debe devolver un objeto serializable con la información. Este objeto es el que se transmitirá al AppDomain principal (de ahí que deba ser serializable). Y no, System.Type no lo es. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;El uso al final es bastante sencillo:&lt;/p&gt;  &lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt;   &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;var&lt;/span&gt; data = &lt;span style="color:#2b91af;"&gt;AppDomainUtils&lt;/span&gt;.GetTypeInfo&amp;lt;&lt;span style="color:#2b91af;"&gt;TypeIdInfo&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;TypeIdInfoLoader&lt;/span&gt;&amp;gt;(tag.TypeName, &lt;span style="color:#2b91af;"&gt;OperativaReader&lt;/span&gt;.ObtenerRutaEnsamblado());&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;En la variable tag.TypeName está el nombre del tipo (full-qualified) a cargar. Al ejecutar esta línea en data tenemos un objeto de tipo TypeIdInfo que contiene la información que nos interesaba extraer del objeto System.Type. La clase TypeIdInfoLoader es la que transforma un System.Type en un TypeIdInfo:&lt;/p&gt;  &lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt;   &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;TypeIdInfoLoader&lt;/span&gt; : &lt;span style="color:#2b91af;"&gt;TypeLoader&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;{&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;protected&lt;/span&gt; &lt;span style="color:blue;"&gt;override&lt;/span&gt; &lt;span style="color:blue;"&gt;object&lt;/span&gt; Select(&lt;span style="color:#2b91af;"&gt;Type&lt;/span&gt; type)&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; {&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;var&lt;/span&gt; data = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;TypeIdInfo&lt;/span&gt;() { FullName = type.FullName };&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; data;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;}&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;El código del méotdo Select de la clase TypeIdInfoLoader se ejecuta en el otro AppDomain, de ahí que deba devolver un objeto serializable (la clase TypeIdInfo debe estar marcada como tal).&lt;/p&gt;  &lt;p&gt;En fin… comentar tan solo que todo este peñazo de usar AppDomains es porque los señores de Microsoft no han tenido a bien proporcionar una API que permite usar Reflection sin cargar la DLL dentro del CLR. Y no, lo siento, pero &lt;a href="http://msdn.microsoft.com/en-us/library/fk4hw0yf.aspx" target="_blank"&gt;esta API no me sirve&lt;/a&gt;. Quiero algo que para usarlo no deba morir mil veces.&lt;/p&gt;  &lt;p&gt;Saludos! ;-)&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=204954" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/etomas/archive/tags/visual+studio/default.aspx">visual studio</category><category domain="http://geeks.ms/blogs/etomas/archive/tags/.net/default.aspx">.net</category></item><item><title>[Channel 9] Uso de snippets en VS2010</title><link>http://geeks.ms/blogs/etomas/archive/2010/12/22/channel-9-uso-de-snippets-en-vs2010.aspx</link><pubDate>Wed, 22 Dec 2010 07:48:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:186252</guid><dc:creator>Eduard Tomàs i Avellana</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/etomas/rsscomments.aspx?PostID=186252</wfw:commentRss><comments>http://geeks.ms/blogs/etomas/archive/2010/12/22/channel-9-uso-de-snippets-en-vs2010.aspx#comments</comments><description>&lt;p&gt;Muy buenas!&lt;/p&gt;
&lt;p&gt;Post cortito, cortito s&amp;oacute;lo para decir que han publicado en &lt;a target="_blank" href="http://channel9.msdn.com/Blogs/channel9spain"&gt;Channel 9 Spain&lt;/a&gt; mi &lt;a target="_blank" href="http://channel9.msdn.com/Blogs/channel9spain/Cmo-usar-Snippets-en-Visual-Studio"&gt;v&amp;iacute;deo sobre c&amp;oacute;mo usar los snippets en VS2010&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Si no conoces lo que son, o bien los usas pero no sabes como definirte los tuyos propios, igual el v&amp;iacute;deo te puede ayudar! Lo ten&amp;eacute;is en:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://channel9.msdn.com/Blogs/channel9spain/Cmo-usar-Snippets-en-Visual-Studio"&gt;http://channel9.msdn.com/Blogs/channel9spain/Cmo-usar-Snippets-en-Visual-Studio&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Un saludo!&lt;/p&gt;
&lt;p&gt;PD: Ayer fue un d&amp;iacute;a intenso en Channel 9, tambi&amp;eacute;n se public&amp;oacute; el &lt;a target="_blank" href="http://channel9.msdn.com/Blogs/channel9spain/Crear-aplicaciones-Silverlight-con-MVVM"&gt;v&amp;iacute;deo de Josue Yerai sobre MVVM en Silverlight&lt;/a&gt; y el&amp;nbsp; de &lt;a target="_blank" href="http://channel9.msdn.com/Blogs/channel9spain/Actualidad-y-futuro-sobre-HTML-5"&gt;Actualidad y futuro sobre HTML5 de Alejandro Mart&amp;iacute;n&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;Un saludo!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=186252" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/etomas/archive/tags/visual+studio/default.aspx">visual studio</category></item><item><title>VS bloquea assemblies cargados desde la web</title><link>http://geeks.ms/blogs/etomas/archive/2010/05/28/vs-bloquea-assemblies-cargados-desde-la-web.aspx</link><pubDate>Fri, 28 May 2010 13:03:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:177431</guid><dc:creator>Eduard Tomàs i Avellana</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/etomas/rsscomments.aspx?PostID=177431</wfw:commentRss><comments>http://geeks.ms/blogs/etomas/archive/2010/05/28/vs-bloquea-assemblies-cargados-desde-la-web.aspx#comments</comments><description>&lt;p&gt;&amp;iexcl;Hola!&lt;/p&gt;
&lt;p&gt;Situaci&amp;oacute;n explicada r&amp;aacute;pidament: Si te descargas un assembly directamente desde internet, y a&amp;ntilde;ades una referencia a dicho assembly, la referencia te aparecer&amp;aacute; como a&amp;ntilde;adida, pero VS no har&amp;aacute; caso de ella. Cuando compiles te aparecer&amp;aacute; un error parecido a:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Unable to load the metadata for assembly &amp;#39;AvalonDock&amp;#39;. This assembly may have been downloaded from the web.&amp;nbsp; See &lt;/em&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkId=179545"&gt;&lt;em&gt;http://go.microsoft.com/fwlink/?LinkId=179545&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&amp;nbsp; The following error was encountered during load: Could not load file or assembly &amp;#39;AvalonDock, Version=1.2.2691.0, Culture=neutral, PublicKeyToken=85a1e0ada7ec13e4&amp;#39; or one of its dependencies. Operation is not supported. (Exception from HRESULT: 0x80131515)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;En mi caso, efectivamente me descargu&amp;eacute; la &amp;uacute;ltima versi&amp;oacute;n de &lt;a target="_blank" href="http://avalondock.codeplex.com/"&gt;AvalonDock&lt;/a&gt; (&lt;a target="_blank" href="http://avalondock.codeplex.com/releases/view/35297"&gt;desde su p&amp;aacute;gina de descargas&lt;/a&gt; puedes descargarte un msi que lo instala o simplemente el assembly que contiene la librer&amp;iacute;a y que es lo que yo hice).&lt;/p&gt;
&lt;p&gt;Por suerte el propio mensaje de error de VS es m&amp;aacute;s que exp&amp;iacute;cito y si te vas a la p&amp;aacute;gina que menciona (&lt;a href="http://go.microsoft.com/fwlink/?LinkId=179545"&gt;&lt;em&gt;http://go.microsoft.com/fwlink/?LinkId=179545&lt;/em&gt;&lt;/a&gt;) ver&amp;aacute;s la explicaci&amp;oacute;n de lo que hay que hacer: B&amp;aacute;sicamente cerrar VS y con el explorador de archivos abrir las propiedades del archivo y darle a desbloquear:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/etomas/image_5F00_0D80E7E4.png"&gt;&lt;img height="244" width="180" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/etomas/image_5F00_thumb_5F00_030013C4.png" alt="image" border="0" title="image" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Y listos! Ya puedes usar tu assembly&amp;hellip; ten presente que esto da permisos full trust al assembly, as&amp;iacute; que&amp;hellip; andate con cuidado! ;-)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&amp;iquest;Y como sabe VS que el archivo ha sido descargado?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Esta pregunta se aplica no s&amp;oacute;lo a VS sin&amp;oacute; a Windows en general. Como sabe Windows que dicho archivo ha sido descargado de la web? Si lo mueves de carpeta, lo renombras o incluso lo copias a otro ordenador windows seguir&amp;aacute; sabiendo que el archivo ha sido descargado de la web.&lt;/p&gt;
&lt;p&gt;La respuesta es realmente simple: Windows guarda esta informaci&amp;oacute;n en el &lt;strong&gt;propio archivo&lt;/strong&gt; y lo hace gracias a una capacidad no muy conocida de NTFS llamada &lt;em&gt;alternate data streams (ADS)&lt;/em&gt;. Dicha capacidad (insisto de NTFS) permite asociar &lt;em&gt;metadatos&lt;/em&gt; a un archivo. Cuando descargamos un archivo de la red, windows crea un ADS en dicho archivo y lo marca como descargado de la red. Los ADS se &lt;em&gt;crean&lt;/em&gt; junto con el archivo (no se guardan en ning&amp;uacute;n sitio separado).&lt;/p&gt;
&lt;p&gt;Para poder abrir un ADS basta con saber el nombre de este y a&amp;ntilde;adirlo junto con dos puntos (:) al nombre del archivo. P.ej. el ADS que windows asocia a los archivos descargados de internet se llama &amp;ldquo;Zone.Identifier&amp;rdquo;. As&amp;iacute;, en mi caso si yo hago:&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;font-size:x-small;"&gt;&lt;strong&gt;notepad AvalonDock.dll:Zone.Identifier&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;obtengo lo siguiente:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/etomas/image_5F00_2242BA97.png"&gt;&lt;img height="65" width="244" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/etomas/image_5F00_thumb_5F00_7691F09A.png" alt="image" border="0" title="image" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Cuando pulso el bot&amp;oacute;n de &amp;ldquo;Unblock&amp;rdquo; desde el explorador de archivos lo que hace es borrar dicho ADS del archivo.&lt;/p&gt;
&lt;p&gt;Usando explorer no podeis saber f&amp;aacute;cilmente si un archivo contiene ADS o no: aunque los ADS &lt;em&gt;modifican&lt;/em&gt; el tama&amp;ntilde;o &lt;em&gt;real&lt;/em&gt; del archivo (puesto que se guardan junto a este), el explorador de archivos s&amp;oacute;lo os muestra el tama&amp;ntilde;o del flujo principal (o sea el del archivo sin los ADS) y lo mismo hace el comando &amp;ldquo;dir&amp;rdquo; de MS-DOS. Si quereis saber los ADS que tienen vuestros archivos, hay por &lt;em&gt;ah&amp;iacute; afuera varios visores de ADS&lt;/em&gt; (aunque yo no he probado ninguno).&lt;/p&gt;
&lt;p&gt;Por cierto, que os he dicho que los ADS, dado que se guardan junto con el archivo, se mantienen cuando se copia, se modifica o se mueve el archivo y esto es cierto &lt;strong&gt;siempre que se use NTFS&lt;/strong&gt;. Si se copia un archivo que contiene ADS a un sistema que no los soporta (p.ej. FAT32 usado en las llaves USB), el ADS se pierde.&lt;/p&gt;
&lt;p&gt;Un saludote!! ;-)&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=177431" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/etomas/archive/tags/visual+studio/default.aspx">visual studio</category><category domain="http://geeks.ms/blogs/etomas/archive/tags/win32/default.aspx">win32</category></item><item><title>VS se queja con un "Could not retrieve the current project" en un archivo .dbml</title><link>http://geeks.ms/blogs/etomas/archive/2008/09/12/vs-se-queja-con-un-quot-could-not-retrieve-the-current-project-quot-en-un-archivo-dbml.aspx</link><pubDate>Fri, 12 Sep 2008 06:19:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:98468</guid><dc:creator>Eduard Tomàs i Avellana</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/etomas/rsscomments.aspx?PostID=98468</wfw:commentRss><comments>http://geeks.ms/blogs/etomas/archive/2008/09/12/vs-se-queja-con-un-quot-could-not-retrieve-the-current-project-quot-en-un-archivo-dbml.aspx#comments</comments><description>&lt;p&gt;Síntoma: tienes una solución que ayer (o hace algunos días, da igual) funcionaba y compilaba bien. Hoy lo abres y aparece un error que dice:&lt;/p&gt;&lt;p&gt;Build failed due to validation errors in C:\edu.tmp\Wof\ClientServer\WoFServer\WoFData.dbml.&amp;nbsp; Open the file and resolve the issues in the Error List, then try rebuilding the project.&lt;/p&gt;&lt;p&gt;Recompilar la solución no sirve para nada. Entonces si intentas abrir el archivo .dmbl, VS se queja con el &amp;quot;Could not retrieve the current project&amp;quot;.&lt;/p&gt;&lt;p&gt;La solución? Invocar VS desde una línea de comandos con:&lt;/p&gt;&lt;p&gt;&lt;b&gt;devenv /ResetSkipPkgs&lt;/b&gt;&amp;nbsp; y listos, todo volverá a funcionar!&lt;/p&gt;&lt;p&gt;La causa de esto es que en alguna carga previa de VS, el paquete (en este caso el diseñador de LINQ) no se carga bien por alguna razón y VS &amp;quot;lo desactiva&amp;quot; para el futuro. Aunque VS avisa de ello (aparece un warning en la ventana de output) es fácil no verlo, o incluso si es un paquete que usamos raramente, no acordarnos.&lt;/p&gt;&lt;p&gt;Evidentemente, en mi caso, el problema se dió con el diseñador de LINQ, pero se puede dar con cualquier paquete de VS que haya tenido algún error de carga.&lt;/p&gt;&lt;p&gt;Nos leemos ;-) &lt;/p&gt;&lt;p&gt;Más info sobre ResetSkipPkgs: &lt;a href="http://msdn.microsoft.com/en-us/library/ms241276.aspx" title="ResetSkipPkgs command line switch"&gt;http://msdn.microsoft.com/en-us/library/ms241276.aspx&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=98468" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/etomas/archive/tags/visual+studio/default.aspx">visual studio</category></item></channel></rss>