<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://msmvps.com/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>Bruno Sonnino : Visual Studio</title><link>http://msmvps.com/blogs/bsonnino/archive/tags/Visual+Studio/default.aspx</link><description>Tags: Visual Studio</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP2 (Build: 40407.4157)</generator><item><title>Microsoft libera o código fonte do .net Framework</title><link>http://msmvps.com/blogs/bsonnino/archive/2007/10/03/microsoft-libera-o-c-243-digo-fonte-do-net-framework.aspx</link><pubDate>Wed, 03 Oct 2007 18:30:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1229367</guid><dc:creator>bsonnino</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/bsonnino/rsscomments.aspx?PostID=1229367</wfw:commentRss><comments>http://msmvps.com/blogs/bsonnino/archive/2007/10/03/microsoft-libera-o-c-243-digo-fonte-do-net-framework.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://weblogs.asp.net/scottgu/archive/2007/10/03/releasing-the-source-code-for-the-net-framework-libraries.aspx"&gt;Este post&lt;/a&gt; do Scott Guthrie anunciou que a Microsoft irá liberar partes do código fonte do Framework .net, sob licença &lt;a href="http://www.microsoft.com/resources/sharedsource/licensingbasics/referencelicense.mspx"&gt;MS-RL&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Isso permitirá que possamos baixar para estudar, verificar o código e até mesmo debugar os fontes das bibliotecas.&lt;/p&gt;  &lt;p&gt;Isso é realmente ótimo, pois além de podermos ver como é que se faz, poderemos ver também o que está acontecento com aqueles bugs estranhos que aparecem, sem que tenhamos uma pista do que acontece nas bibliotecas do Framework.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1229367" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/bsonnino/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://msmvps.com/blogs/bsonnino/archive/tags/.net+Framework/default.aspx">.net Framework</category></item><item><title>Manipulando a lista "Recent Projects" do Visual Studio</title><link>http://msmvps.com/blogs/bsonnino/archive/2007/08/29/manipulando-a-lista-quot-recent-projects-quot-do-visual-studio.aspx</link><pubDate>Wed, 29 Aug 2007 22:16:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1146755</guid><dc:creator>bsonnino</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/bsonnino/rsscomments.aspx?PostID=1146755</wfw:commentRss><comments>http://msmvps.com/blogs/bsonnino/archive/2007/08/29/manipulando-a-lista-quot-recent-projects-quot-do-visual-studio.aspx#comments</comments><description>&lt;p&gt;Algumas vezes eu faço uns projetos de teste no Visual Studio e a lista &amp;quot;Recent Projects&amp;quot; fica cheia de nomes como &amp;quot;ConsoleApplication1&amp;quot;, &amp;quot;WebSite1&amp;quot;. Eu gostaria de limpar, mas o VS não tem nada para apagar os nomes da lista. &lt;/p&gt;

&lt;p&gt;Então resolvi dar uma pesquisada e verifiquei que esta lista fica em&lt;i&gt; HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\9.0\ProjectMRUList&lt;/i&gt; para o VS2008 e em &lt;i&gt;HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\8.0\ProjectMRUList&lt;/i&gt;, nos valores &lt;span style="font-style:italic;"&gt;File1&lt;/span&gt;, &lt;span style="font-style:italic;"&gt;File2&lt;/span&gt;, &lt;span style="font-style:italic;"&gt;File3&lt;/span&gt;,.... &lt;/p&gt;&lt;p&gt;Assim, resolvi criar um pequeno programa que permite excluir arquivos desta lista para mim. Basta criar uma aplicação WinForms e colocar uma&amp;nbsp; ListView, com uma coluna, &amp;quot;Nome&amp;quot;. No evento &lt;b&gt;Load&lt;/b&gt; usamos a classe &lt;b&gt;Registry&lt;/b&gt; para ler os arquivos desta chave:&lt;/p&gt;
&lt;code&gt;
&lt;/code&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private void Form1_Load(object sender, EventArgs e)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LeListaMru();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private void LeListaMru()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; listView1.Items.Clear();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Abre chave do MRU do VS&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; using (RegistryKey regKey = Registry.CurrentUser.OpenSubKey(MRUKEY))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Pega lista de arquivos do MRU&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string[] arquivos = regKey.GetValueNames();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (string arq in arquivos)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Adiciona nome do arquivo na ListView&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string keyValue = (string)regKey.GetValue(arq,&amp;quot;&amp;quot;,RegistryValueOptions.DoNotExpandEnvironmentNames);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (keyValue != &amp;quot;&amp;quot;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; listView1.Items.Add(Environment.ExpandEnvironmentVariables(keyValue)).Tag = keyValue;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;

&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Aqui, um pequeno truque: a lista é guardada com os nomes dos arquivos usando-se as variáveis de ambiente, como &lt;span style="font-weight:bold;"&gt;%USERPROFILE%&lt;/span&gt;, em chaves do tipo &lt;span style="font-weight:bold;"&gt;REG_EXPAND_SZ&lt;/span&gt;. Lemos as chaves sem expandi-las e adicionamos na lista, expandindo o nome usando &lt;span style="font-weight:bold;"&gt;ExpandEnvironmentVariables&lt;/span&gt; e guardamos o nome original no objeto &lt;span style="font-weight:bold;"&gt;Tag&lt;/span&gt;. Com isso, temos acesso ao nome expandido e não expandido.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Com a lista na janela, selecionamos os arquivos que queremos excluir e teclamos Del para exclui-los. No evento KeyDown da ListView excluimos os valores selecionados:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private void listView1_KeyDown(object sender, KeyEventArgs e)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Se teclou Delete&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (e.KeyCode == Keys.Delete &amp;amp;&amp;amp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MessageBox.Show(&amp;quot;Confirma exclusão dos projetos selecionados?&amp;quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;quot;Exclui projetos&amp;quot;, MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Abre chave do MRU do VS&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; using (RegistryKey regKey = Registry.CurrentUser.OpenSubKey(MRUKEY,true))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Apaga os valores atuais&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string[] arquivos = regKey.GetValueNames();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (string arq in arquivos)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; regKey.DeleteValue(arq);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Grava os valores só dos itens não selecionados&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int k = 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (ListViewItem item in listView1.Items)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!item.Selected)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; regKey.SetValue(string.Format(&amp;quot;File{0}&amp;quot;, k), (string)item.Tag, RegistryValueKind.ExpandString);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; k++;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LeListaMru();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Aqui, uma observação: o Visual Studio não gosta de buracos na lista: se ele não encontrar o &lt;span style="font-style:italic;"&gt;File2&lt;/span&gt;, ele despreza o restante da lista. Assim, o que fiz foi deletar toda a lista e só gravar os valores não selecionados, rearranjando-a. Com este pequeno programa, posso manipular a lista de projetos recentes do Visual Studio e deixá-la do jeito que quero. &lt;br /&gt;&lt;/p&gt;

&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1146755" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/bsonnino/archive/tags/Visual+Studio/default.aspx">Visual Studio</category></item></channel></rss>