<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-US"><title type="html">Andrew Arnott</title><subtitle type="html">News from my corner of the Visual Studio Project &amp; Build team, programming tips, and solutions to common programming issues.</subtitle><id>http://blogs.msdn.com/andrewarnottms/atom.xml</id><link rel="alternate" type="text/html" href="http://blogs.msdn.com/andrewarnottms/default.aspx" /><link rel="self" type="application/atom+xml" href="http://blogs.msdn.com/andrewarnottms/atom.xml" /><generator uri="http://communityserver.org" version="2.1.61025.2">Community Server</generator><updated>2008-01-01T15:31:00Z</updated><entry><title>Visual Studio 2010 editor vs. gVim over Remote Desktop</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/andrewarnottms/archive/2009/10/19/visual-studio-2010-editor-vs-gvim-over-remote-desktop.aspx" /><id>http://blogs.msdn.com/andrewarnottms/archive/2009/10/19/visual-studio-2010-editor-vs-gvim-over-remote-desktop.aspx</id><published>2009-10-19T08:00:00Z</published><updated>2009-10-19T08:00:00Z</updated><content type="html">&lt;p&gt;For those of you who may think WPF is too slow, you gotta check this out. Visual Studio 2010's new WPF-based code editor is &lt;i&gt;lightening&lt;/i&gt; fast, especially when compared over a fast FiOS Remote Desktop connection to gVim!&lt;/p&gt; &lt;iframe style="width: 500px; height: 375px" src="http://silverlight.services.live.com/invoke/107522/Visual%20Studio%202010%20editor%20vs.%20gVim%20over%20Remote%20Desktop/iframe.html" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9897053" width="1" height="1"&gt;</content><author><name>andarno</name><uri>http://blogs.msdn.com/members/andarno.aspx</uri></author><category term="WPF" scheme="http://blogs.msdn.com/andrewarnottms/archive/tags/WPF/default.aspx" /><category term="Visual Studio" scheme="http://blogs.msdn.com/andrewarnottms/archive/tags/Visual+Studio/default.aspx" /></entry><entry><title>How to force Vista to NOT elevate an application</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/andrewarnottms/archive/2008/10/15/how-to-force-vista-to-not-elevate-an-application.aspx" /><id>http://blogs.msdn.com/andrewarnottms/archive/2008/10/15/how-to-force-vista-to-not-elevate-an-application.aspx</id><published>2008-10-15T09:52:39Z</published><updated>2008-10-15T09:52:39Z</updated><content type="html">&lt;p&gt;User Account Control, the feature in Vista that causes installers and some applications to require &amp;quot;elevation&amp;quot; to administrator privileges to run, cuts both ways.&amp;#160; It's designed to protect users from apps that try to make system-level changes by giving the user the heads up that it's about to happen and gives the user the chance to abort the operation.&amp;#160; The flip-side is that since this is an inconvenience to users, software writers are motivated to write their software so that it doesn't require admin privileges, further improving security on the system.&lt;/p&gt;  &lt;p&gt;While there are problems with UAC, the most aggravating (for me) is that Vista insists on elevating some apps that don't need elevation.&amp;#160; For example, all setup.exe programs &lt;em&gt;always&lt;/em&gt; elevate, since most users don't want setup programs failing halfway through.&amp;#160; Other programs, like regedit.exe, have manifests that say to Vista, in effect, &amp;quot;I can run in user mode or admin mode, but give me admin mode if it's available&amp;quot;.&amp;#160; So when a non-admin account launches regedit.exe, regedit comes up without requesting elevation.&amp;#160; But if an admin account launches regedit, the UAC dialog comes up.&amp;#160; Fair enough.&amp;#160; &lt;/p&gt;  &lt;p&gt;But what if I &lt;em&gt;don't want&lt;/em&gt; to elevate an app that wants it?&amp;#160; For example, if I didn't want regedit.exe to have admin privileges to help protect me from myself when I only intended to modify HKEY_CURRENT_USER, which doesn't require admin rights.&amp;#160; &lt;/p&gt;  &lt;p&gt;But the more common scenario I find myself in is when I download software I do not entirely trust.&amp;#160; The software comes with a setup program, which I have to run in order to use the software.&amp;#160; I intend to install the program in a private user area rather than Program Files in order to avoid having to elevate the program or its setup program.&amp;#160; But Vista always insists on elevating setup.exe programs.&amp;#160; &lt;/p&gt;  &lt;p&gt;There &lt;em&gt;is&lt;/em&gt; a way to coerce Vista to &lt;em&gt;not&lt;/em&gt; elevate a process that it otherwise would.&amp;#160; &lt;/p&gt;  &lt;pre&gt;REM The next command MUST be run from an elevated command window.
REM It launches regedit.exe WITHOUT elevated privileges.
runas /trustlevel:0x20000 regedit.exe&lt;/pre&gt;

&lt;p&gt;Ironically, starting a program explicitly without elevation requires an elevated command prompt.&amp;#160; Go figure.&lt;/p&gt;

&lt;p&gt;So next time an untrusted program prompts for elevation that you don't want to give, try this nifty command.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9000397" width="1" height="1"&gt;</content><author><name>andarno</name><uri>http://blogs.msdn.com/members/andarno.aspx</uri></author></entry><entry><title>GZip encoder for Compact WCF</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/andrewarnottms/archive/2008/10/01/gzip-encoder-for-compact-wcf.aspx" /><id>http://blogs.msdn.com/andrewarnottms/archive/2008/10/01/gzip-encoder-for-compact-wcf.aspx</id><published>2008-10-01T05:13:07Z</published><updated>2008-10-01T05:13:07Z</updated><content type="html">&lt;p&gt;The GZip encoder is not included in NetCF as it is on the desktop WCF, but it isn't hard to build yourself and in fact we have released a sample of exactly how to add your own GZip encoder to NetCF:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkId=108652"&gt;http://go.microsoft.com/fwlink/?LinkId=108652&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;So many people have asked me for it lately I thought I'd better just post the link.&amp;#160; Have fun!&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8971022" width="1" height="1"&gt;</content><author><name>andarno</name><uri>http://blogs.msdn.com/members/andarno.aspx</uri></author><category term="Mobile devices" scheme="http://blogs.msdn.com/andrewarnottms/archive/tags/Mobile+devices/default.aspx" /><category term="NetCF" scheme="http://blogs.msdn.com/andrewarnottms/archive/tags/NetCF/default.aspx" /><category term="WCF" scheme="http://blogs.msdn.com/andrewarnottms/archive/tags/WCF/default.aspx" /><category term=".NET" scheme="http://blogs.msdn.com/andrewarnottms/archive/tags/.NET/default.aspx" /></entry><entry><title>If the MS Office team wrote Visual Studio</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/andrewarnottms/archive/2008/08/05/if-the-ms-office-team-wrote-visual-studio.aspx" /><id>http://blogs.msdn.com/andrewarnottms/archive/2008/08/05/if-the-ms-office-team-wrote-visual-studio.aspx</id><published>2008-08-05T09:29:21Z</published><updated>2008-08-05T09:29:21Z</updated><content type="html">&lt;p&gt;Some humorous pros and cons to Visual Studio, if the Microsoft Office team were ever to take over. (disclaimer: this is a tongue in cheek post.&amp;#160; No offense -- only laughs intended)&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Visual Studio 2008 would be able to load VC7 projects, modify them in any way VC7 allowed, and save the project back to VC7 format, allowing you to work with others still using VC7.&amp;#160; &lt;/li&gt;    &lt;li&gt;You could download an extension to VC7 that would allow you to work with VS2008 projects in a limited way. &lt;/li&gt;    &lt;li&gt;Your projects would open in any copy of Visual Studio just fine, until you added any code to it.&amp;#160; Then VS would refuse to load it until you changed the security settings in Tools -&amp;gt; Options from High to Low.&amp;#160; And you'd still get a security warning at every load. &lt;/li&gt;    &lt;li&gt;To send your codebase to someone else without allowing them to change it, you would Save to PDF. &lt;/li&gt;    &lt;li&gt;Source control would be integrated into each individual source file (but you'd have to turn it on first, per file), and merging changes from others would involve Track Changes with &lt;strike&gt;strikethroughs&lt;/strike&gt; and &lt;u&gt;underlines&lt;/u&gt; instead of &lt;span style="background-color: yellow"&gt;yellows&lt;/span&gt; and &lt;span style="background-color: red"&gt;reds&lt;/span&gt;. &lt;/li&gt;    &lt;li&gt;Source files would become programmable with embedded macro scripts, allowing a change in one part of the source file to affect other areas, perhaps with some intermediate calculation.&amp;#160; &lt;/li&gt;    &lt;li&gt;Compilation would occur in the background, or instantaneously on demand. &lt;/li&gt;    &lt;li&gt;No build breaks.&amp;#160; Ever.&amp;#160; But the spell checker might point out some possible areas of improvement.&lt;/li&gt;    &lt;li&gt;Methods would be phrases and have spaces.&lt;/li&gt;    &lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Shakespeare_programming_language"&gt;Shakespeare&lt;/a&gt; would be the default programming language.&lt;/li&gt; &lt;/ol&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8833224" width="1" height="1"&gt;</content><author><name>andarno</name><uri>http://blogs.msdn.com/members/andarno.aspx</uri></author><category term="Visual Studio" scheme="http://blogs.msdn.com/andrewarnottms/archive/tags/Visual+Studio/default.aspx" /></entry><entry><title>Visual Studio trick to quickly find any file in solution</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/andrewarnottms/archive/2008/08/02/visual-studio-trick-to-quickly-find-any-file-in-solution.aspx" /><id>http://blogs.msdn.com/andrewarnottms/archive/2008/08/02/visual-studio-trick-to-quickly-find-any-file-in-solution.aspx</id><published>2008-08-02T22:04:37Z</published><updated>2008-08-02T22:04:37Z</updated><content type="html">&lt;p&gt;You know that Find text box in the toolbar of Visual Studio?&amp;#160; Those of us who are keyboard-inclined probably never use it because Ctrl+F is quicker than moving your hand to the mouse.&amp;#160; But there is a hidden gem of a feature inside it that really makes me feel like a power user that I wanted to share.&lt;/p&gt;  &lt;p&gt;That find box doubles as a Command Window prompt if you just start with a '&amp;gt;' sign.&amp;#160; The feature in this that I use the most is this:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/andrewarnottms/WindowsLiveWriter/VisualStudiotricktoquicklyfindanyfileins_A82B/image_2.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="106" alt="image" src="http://blogs.msdn.com/blogfiles/andrewarnottms/WindowsLiveWriter/VisualStudiotricktoquicklyfindanyfileins_A82B/image_thumb.png" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;First jump up to that box using the keystroke Ctrl+/.&amp;#160; Now type &amp;quot;&amp;gt;of &amp;quot; and follow with the start of a filename.&amp;#160; As fast as you can type, Visual Studio searches your entire solution for a file or path that starts with the characters you type and you can quickly select that file (with the keyboard using the arrow keys if you wish) and open it.&amp;#160; If you're working in a solution with several projects or folders, this can be a significant time saver.&lt;/p&gt;  &lt;p&gt;For those of you unfamiliar with the Command Window, you can think of it like an Immediate Window that you use with the debugger, except that instead of controlling the debuggee, you're controlling Visual Studio.&amp;#160; It's like the VS macro editor, except that everything you type takes immediate effect.&amp;#160; To have this conveniently just a Ctrl+/, &amp;gt; keystroke away, especially when &amp;quot;&amp;gt;of &amp;quot; (short for Open File) is such a convenient acronym to search across your entire solution is awesome.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8806975" width="1" height="1"&gt;</content><author><name>andarno</name><uri>http://blogs.msdn.com/members/andarno.aspx</uri></author><category term="Visual Studio" scheme="http://blogs.msdn.com/andrewarnottms/archive/tags/Visual+Studio/default.aspx" /></entry><entry><title>OpenID and ASP.NET web sites</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/andrewarnottms/archive/2008/04/14/openid-and-asp-net-web-sites.aspx" /><id>http://blogs.msdn.com/andrewarnottms/archive/2008/04/14/openid-and-asp-net-web-sites.aspx</id><published>2008-04-15T01:21:10Z</published><updated>2008-04-15T01:21:10Z</updated><content type="html">&lt;p&gt;If you are a web developer I hope you've considered accepting &lt;a href="http://openid.net"&gt;OpenID&lt;/a&gt; credentials for logging in your users.&amp;#160; If you have an ASP.NET web site, the process of adding OpenID support to your web site &lt;a href="http://blog.nerdbank.net/2008/04/how-to-add-openid-to-your-aspnet-web.html"&gt;couldn't be easier&lt;/a&gt; when you use the free C# &lt;a href="http://dotnetopenid.googlecode.com"&gt;DotNetOpenId&lt;/a&gt; library.&amp;#160; &lt;/p&gt;  &lt;p&gt;Supporting OpenID is a great idea:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;No more &amp;quot;I forgot my username/password&amp;quot; pages. &lt;/li&gt;    &lt;li&gt;No more &amp;quot;Change Password&amp;quot; pages. &lt;/li&gt;    &lt;li&gt;Your users have one less username/password to make-up/reuse when they join your site. &lt;/li&gt;    &lt;li&gt;Users who prefer greater security than a username/password provides can choose an OpenID Provider that provides that assurance, without you having to enhance your site. &lt;/li&gt;    &lt;li&gt;It's free.&amp;#160; And so are &lt;a href="http://wiki.openid.net/Libraries"&gt;the libraries&lt;/a&gt; that you can drop in to add support for it. &lt;/li&gt; &lt;/ol&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8395098" width="1" height="1"&gt;</content><author><name>andarno</name><uri>http://blogs.msdn.com/members/andarno.aspx</uri></author><category term="Identity" scheme="http://blogs.msdn.com/andrewarnottms/archive/tags/Identity/default.aspx" /><category term=".NET" scheme="http://blogs.msdn.com/andrewarnottms/archive/tags/.NET/default.aspx" /></entry><entry><title>Why you should never use TCHAR in C++ header files</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/andrewarnottms/archive/2008/02/22/why-you-should-never-use-tchar-in-c-header-files.aspx" /><id>http://blogs.msdn.com/andrewarnottms/archive/2008/02/22/why-you-should-never-use-tchar-in-c-header-files.aspx</id><published>2008-02-23T02:38:48Z</published><updated>2008-02-23T02:38:48Z</updated><content type="html">&lt;p&gt;In C++, TCHAR, LPCTSTR, CString, and other types discretely change to their char/WCHAR, CStringA/CStringW counterparts depending on whether UNICODE is defined in your source code.&amp;#160; Cool.&amp;#160; By conscientiously using _countof(x) instead of sizeof(x) where appropriate and TCHAR's everywhere instead of char/WCHAR, you can write code that will compile with ANSI or UNICODE support as easy as flipping a switch.&amp;#160; But these tricks are &lt;em&gt;not&lt;/em&gt; safe in .h header files.&lt;/p&gt;  &lt;p&gt;Consider the following very simple scenario:&lt;/p&gt;  &lt;p&gt;tool.h:&lt;/p&gt;  &lt;p&gt;void SayHello(CString recipient);&lt;/p&gt;  &lt;p&gt;tool.cpp&lt;/p&gt;  &lt;p&gt;//#define UNICODE   &lt;br /&gt;#include &amp;quot;tool.h&amp;quot;    &lt;br /&gt;void SayHello(CString recipient)    &lt;br /&gt;{    &lt;br /&gt;&amp;#160;&amp;#160; printf(_T(&amp;quot;Hello, %s&amp;quot;), recipient);    &lt;br /&gt;}&lt;/p&gt;  &lt;p&gt;Compiled into a standalone app, these two files would easily compile with or without the UNICODE symbol set and the right thing would happen.&amp;#160; &lt;/p&gt;  &lt;p&gt;But now consider that you compiled this not into a standalone .exe but into a .lib or .dll, and shared out the .h header file with some consuming application (which might be an external customer).&amp;#160; That header file will be #include'd into their app, which may or may not define the UNICODE symbol.&amp;#160; Suppose you defined UNICODE and the linking app did not.&amp;#160; The header file will automatically adjust to the consuming app's ANSI style strings and the C++ compiler and linker will be perfectly happy. You won't know there's a problem with the app passing ANSI strings to your UNICODE library until runtime when you get random data corruption and application crashes.&lt;/p&gt;  &lt;p&gt;How do you avoid this?&amp;#160; Well there are two ways, really.&amp;#160; If you already have an extensive library written with header files that use TCHARs and their cousins, just compile and ship both a UNICODE and an ANSI version of your library (toolA.lib and toolU.lib).&amp;#160; Then instruct your customer to link to the correct one.&amp;#160; &lt;/p&gt;  &lt;p&gt;But if you're writing a library from scratch, consider using all strongly-typed ANSI or UNICODE character types in your .h files, and in the method signatures of your .CPP files.&amp;#160; Then use whatever generic TCHAR's make sense within the implementation of your methods.&amp;#160; So for example:&lt;/p&gt;  &lt;p&gt;tool.h:&lt;/p&gt;  &lt;p&gt;void SayHello(CStringW recipient);&lt;/p&gt;  &lt;p&gt;tool.cpp&lt;/p&gt;  &lt;p&gt;//#define UNICODE   &lt;br /&gt;#include &amp;quot;tool.h&amp;quot;    &lt;br /&gt;void SayHello(CStringW recipient)    &lt;br /&gt;{    &lt;br /&gt;&amp;#160;&amp;#160; USES_CONVERSION;    &lt;br /&gt;    &lt;br /&gt;&amp;#160;&amp;#160; wprintf(L&amp;quot;Hello, %s&amp;quot;, recipient);    &lt;br /&gt;    &lt;br /&gt;&amp;#160;&amp;#160; // Call some ATL/MFC function that is only available in TCHARs    &lt;br /&gt;&amp;#160;&amp;#160; TCHAR szBuffer[] = _T(&amp;quot;Some TCHAR buffer&amp;quot;);    &lt;br /&gt;&amp;#160;&amp;#160; SomeImplementationSpecificMethod(szBuffer, CW2T(recipient));    &lt;br /&gt;}&lt;/p&gt;  &lt;p&gt;This will compile with or without the UNICODE symbol defined, but the method signature will always be UNICODE, and the internals of method implementation will automatically adjust as appropriate for UNICODE or ANSI support.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=7851961" width="1" height="1"&gt;</content><author><name>andarno</name><uri>http://blogs.msdn.com/members/andarno.aspx</uri></author><category term="C++" scheme="http://blogs.msdn.com/andrewarnottms/archive/tags/C_2B002B00_/default.aspx" /></entry><entry><title>Why your Visual Studio add-in fails to load with error 0x80004005</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/andrewarnottms/archive/2008/02/15/why-your-visual-studio-add-in-fails-to-load-with-error-0x80004005.aspx" /><id>http://blogs.msdn.com/andrewarnottms/archive/2008/02/15/why-your-visual-studio-add-in-fails-to-load-with-error-0x80004005.aspx</id><published>2008-02-15T19:43:31Z</published><updated>2008-02-15T19:43:31Z</updated><content type="html">&lt;p&gt;Writing Visual Studio add-ins gives you the power to do some impressive things within the IDE to enhance your productivity.&amp;#160; Unfortunately getting your add-in to load into Visual Studio can sometimes be a pain.&amp;#160; Here's just a tip you should know about the .AddIn file that Visual Studio generates for you.&lt;/p&gt;  &lt;p&gt;The path you provide to the add-in assembly .dll should be relative to the location of the .AddIn file itself.&amp;#160; Absolute paths do not work.&amp;#160; If you try using one, you get an unhelpful error dialog that mentions error code 0x80004005.&lt;/p&gt;  &lt;p&gt;Hopefully we can get some more useful error messages in future versions of Visual Studio.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=7718361" width="1" height="1"&gt;</content><author><name>andarno</name><uri>http://blogs.msdn.com/members/andarno.aspx</uri></author><category term="Visual Studio" scheme="http://blogs.msdn.com/andrewarnottms/archive/tags/Visual+Studio/default.aspx" /></entry><entry><title>Why double-clicking on an .SLN file doesn't always launch Visual Studio</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/andrewarnottms/archive/2008/02/13/why-double-clicking-on-an-sln-file-doesn-t-always-launch-visual-studio.aspx" /><id>http://blogs.msdn.com/andrewarnottms/archive/2008/02/13/why-double-clicking-on-an-sln-file-doesn-t-always-launch-visual-studio.aspx</id><published>2008-02-13T23:32:42Z</published><updated>2008-02-13T23:32:42Z</updated><content type="html">&lt;p&gt;Well this is my first post as a member of the Visual Studio Platform &amp;amp; Ecosystem team.&amp;#160; My second full day on the job, and I've found some less-than-ideal areas of Visual Studio that I'm eager to improve for myself and for you, our customers.&amp;#160; How exciting.&amp;#160; I'll do my best to post to my blog whenever I run across some unexpected scenario that is likely to hit customers and how to work around it.&lt;/p&gt;  &lt;p&gt;So on to the first scenario...&lt;/p&gt;  &lt;h4&gt;Scenario&lt;/h4&gt;  &lt;p&gt;You have Visual Studio 2008 installed, but some Visual Studio Solution files (.sln) don't open when you double-click on them.&amp;#160; In fact, &lt;em&gt;nothing&lt;/em&gt; happens.&lt;/p&gt;  &lt;h4&gt;Analysis&lt;/h4&gt;  &lt;p&gt;When you double-click on a .sln file, a small program called vslauncher.exe is called with the path to your .sln file as its first argument.&amp;#160; The job of vslauncher.exe is to read enough of your .sln file to determine which version of Visual Studio to use to open your file.&amp;#160; Since you may have several versions of Visual Studio installed (VS2003, 2005, 2008, Express SKUs, etc.) you probably want to open the solution with the same copy of Visual Studio that you used to create it.&lt;/p&gt;  &lt;p&gt;The issue comes up when your .sln file signature (the first two lines of your file) don't match any known release of Visual Studio.&amp;#160; Visual Studio 2008 .sln files typically start with these two lines:&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;Microsoft Visual Studio Solution File, Format Version 10.00      &lt;br /&gt;# Visual Studio 2008&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;But suppose you have a .sln file that was created with a Visual Studio 2008 beta.&amp;#160; You might have a .sln file that starts with this instead:&lt;/p&gt; &lt;font face="Consolas"&gt;Microsoft Visual Studio Solution File, Format Version 10.00    &lt;br /&gt;# Visual Studio Codename Orcas&lt;/font&gt;   &lt;p&gt;When Visual Studio 2008 RTM reads this, it doesn't recognize its earlier beta versions' solution file signatures and just quits.&amp;#160; It would be nice if a user-friendly message telling what happened would pop up.&amp;#160; Alas, it does not.&lt;/p&gt;  &lt;h4&gt;Workaround&lt;/h4&gt;  &lt;p&gt;Simply open your .sln file in Notepad and change &amp;quot;Codename Orcas&amp;quot; to &amp;quot;2008&amp;quot; on the second line.&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;[Update 2/16/08]&lt;/strong&gt; This blog was featured on &lt;a href="http://channel9.msdn.com/showpost.aspx?postid=383355"&gt;Channel 9&lt;/a&gt;, and as a result a couple of people wrote up a &lt;a href="http://www.liensberger.it/web/blog/?p=230"&gt;PowerShell script and a C# program to automate updating all your .sln files at once&lt;/a&gt;.&amp;#160; Very cool. &lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=7680255" width="1" height="1"&gt;</content><author><name>andarno</name><uri>http://blogs.msdn.com/members/andarno.aspx</uri></author><category term="Visual Studio" scheme="http://blogs.msdn.com/andrewarnottms/archive/tags/Visual+Studio/default.aspx" /></entry><entry><title>Write a NetCF app that provisions your device from your device</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/andrewarnottms/archive/2008/02/04/write-a-netcf-app-that-provisions-your-device-from-your-device.aspx" /><id>http://blogs.msdn.com/andrewarnottms/archive/2008/02/04/write-a-netcf-app-that-provisions-your-device-from-your-device.aspx</id><published>2008-02-04T10:42:31Z</published><updated>2008-02-04T10:42:31Z</updated><content type="html">&lt;p&gt;&lt;a href="http://blogs.msdn.com/andrewarnottms/archive/2007/11/29/provisioning-smart-devices-an-introduction.aspx"&gt;My first post in the provisioning series&lt;/a&gt; introduced what provisioning of your Windows Mobile device means and the basics of why you would want to do it.&amp;#160; In future posts I'll give some concrete examples of XML that accomplish a few common tasks.&amp;#160; But what good are XML examples if you can't try them out on your device or emulator?&amp;#160; It would be much better if you had an app that would let you write in XML and see what happens when you send it to the provisioning API of Windows Mobile.&amp;#160; I'd like to introduce you to a sample I wrote just for this purpose.&amp;#160; &lt;/p&gt;  &lt;p&gt;The open-source &lt;a href="http://code.msdn.microsoft.com/provisionwm"&gt;Windows Mobile Provisioning tool&lt;/a&gt; is a .NET Compact Framework application that exposes provisioning directly to the user.&amp;#160; It will take strings of XML and pass them directly to Windows Mobile and return the resulting XML.&amp;#160; It also has an interface to help you set a proxy server and add domains to the Work network and crafts the provisioning XML for you.&amp;#160; &lt;/p&gt;  &lt;p&gt;Over time I may add additional built-in provisioning scenarios to the sample.&amp;#160; But for now, download it, compile it, and try it out.&amp;#160; Let me know what you think, either here or on the &lt;a href="http://code.msdn.microsoft.com/provisionwm/Thread/List.aspx"&gt;Discussions page&lt;/a&gt; for this sample.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=7375455" width="1" height="1"&gt;</content><author><name>andarno</name><uri>http://blogs.msdn.com/members/andarno.aspx</uri></author><category term="Mobile devices" scheme="http://blogs.msdn.com/andrewarnottms/archive/tags/Mobile+devices/default.aspx" /><category term="NetCF" scheme="http://blogs.msdn.com/andrewarnottms/archive/tags/NetCF/default.aspx" /><category term="Provisioning" scheme="http://blogs.msdn.com/andrewarnottms/archive/tags/Provisioning/default.aspx" /></entry><entry><title>Microsoft launches MSDN Code Gallery for open-source sharing</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/andrewarnottms/archive/2008/02/01/microsoft-launches-msdn-code-gallery-for-open-source-sharing.aspx" /><id>http://blogs.msdn.com/andrewarnottms/archive/2008/02/01/microsoft-launches-msdn-code-gallery-for-open-source-sharing.aspx</id><published>2008-02-01T18:28:28Z</published><updated>2008-02-01T18:28:28Z</updated><content type="html">&lt;p&gt;Microsoft recently launched the &lt;a href="http://code.msdn.microsoft.com"&gt;MSDN Code Gallery&lt;/a&gt; for Microsoft employees and others to share code and software using the &lt;a href="http://www.google.com/url?sa=t&amp;amp;ct=res&amp;amp;cd=1&amp;amp;url=http%3A%2F%2Fwww.microsoft.com%2Fresources%2Fsharedsource%2Flicensingbasics%2Fpubliclicense.mspx&amp;amp;ei=ETqjR96_DYb6pgTKzsTQBA&amp;amp;usg=AFQjCNG2vkqtTakXi7dZdB7IgOvRFlHo4A&amp;amp;sig2=EmX_8VBlI9DArjFJLmENPg"&gt;Microsoft Public License&lt;/a&gt;.&amp;#160; MSDN Code Gallery looks and feels very much like &lt;a href="http://www.codeplex.com"&gt;CodePlex&lt;/a&gt;, but Code Gallery lacks the TFS source control feature and developers can only publish their source code and binaries as releases.&lt;/p&gt;  &lt;p&gt;As a Microsoft employee, I am happy to see this site launch as it finally gives us an easy way to publish more source code from our blogs.&amp;#160; Watch my blog for a new device provisioning app that I will publish soon.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=7375336" width="1" height="1"&gt;</content><author><name>andarno</name><uri>http://blogs.msdn.com/members/andarno.aspx</uri></author></entry><entry><title>New job with Visual Studio Platform &amp; Ecosystem</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/andrewarnottms/archive/2008/01/24/new-job-with-visual-studio-platform-ecosystem.aspx" /><id>http://blogs.msdn.com/andrewarnottms/archive/2008/01/24/new-job-with-visual-studio-platform-ecosystem.aspx</id><published>2008-01-25T00:55:51Z</published><updated>2008-01-25T00:55:51Z</updated><content type="html">&lt;p&gt;I have accepted a new position within Microsoft with the Visual Studio Platform &amp;amp; Ecosystem team.&amp;#160; Rather than working on the .NET Compact Framework I will be working on &amp;quot;VS10&amp;quot;.&amp;#160; &lt;/p&gt;  &lt;p&gt;I don't actually make the transition for a few more weeks, so I look forward to several more posts on NetCF topics before leaving.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=7227692" width="1" height="1"&gt;</content><author><name>andarno</name><uri>http://blogs.msdn.com/members/andarno.aspx</uri></author></entry><entry><title>XmlSerializer compatibility between NetCF and the desktop</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/andrewarnottms/archive/2008/01/23/xmlserializer-compatibility-between-netcf-and-the-desktop.aspx" /><id>http://blogs.msdn.com/andrewarnottms/archive/2008/01/23/xmlserializer-compatibility-between-netcf-and-the-desktop.aspx</id><published>2008-01-24T00:28:43Z</published><updated>2008-01-24T00:28:43Z</updated><content type="html">&lt;p&gt;The XmlSerializer found in the .NET Compact Framework has a very different implementation than the one found in the full .NET Framework.&amp;#160; The reasons for the differences include size and performance constraints that make the desktop's XmlSerializer inappropriate for devices.&amp;#160; &lt;/p&gt;  &lt;p&gt;As a result of the different implementation, there are inevitably going to be differences between how each serializer turns objects into XML and back again.&amp;#160; We try to minimize these differences so that your C# code will run on NetCF and desktop in a very portable way.&amp;#160; When we find differences, we have to weigh the consequences of possibly breaking backward compatibility with applications written for earlier versions of NetCF against breaking compatibility with desktop for current and future applications.&lt;/p&gt;  &lt;p&gt;One area where cross-platform compatibility becomes particularly important is in web services.&amp;#160; When you generate web service proxies for your NetCF applications using Visual Studio's Add Web Reference function (or the command line wsdl.exe, xsd.exe, or NetCFSvcUtil.exe tools) you expect those proxies to serialize to XML that the service is expecting.&amp;#160; These tools are generally developed and tested against the desktop's version of the XmlSerializer more thoroughly than against the NetCF XmlSerializer.&amp;#160; So any differences in how NetCF's XmlSerializer works could cause incompatible xml to be sent to a service.&lt;/p&gt;  &lt;p&gt;As I have been code reviewing .NET Compact Framework's version of the serializer and fixing bugs in it, I've come across a number of differences in how the two serializers behave that can affect web services.&amp;#160; Some of these fixes made it into NetCF 2.0 SP2.&amp;#160; Many more made it into NetCF 3.5.&amp;#160; But quite a few issues were discovered too late to fix in the NetCF 3.5 release.&amp;#160; &lt;/p&gt;  &lt;p&gt;In an upcoming NetCF release there are likely to be some breaking changes to the way the XmlSerializer works in order to improve web service and desktop compatibility.&amp;#160; This is likely to only affect applications that use multiple namespaces in a single type that is being serialized as that is where most of the bugs seem to be.&lt;/p&gt;  &lt;p&gt;You can prepare for these changes by testing your application on the full .NET Framework today.&amp;#160; If it runs correctly there, then it will probably run correctly on a future version of the .NET Compact Framework. If you notice that the XML the desktop produces is different than what NetCF produces, you will probably need to adjust your code so that it produces the desired XML on the full Framework, and consider releasing a service pack for your own application to your customers who are using new versions of NetCF.&lt;/p&gt;  &lt;p&gt;A full list of breaking changes is published with each release of the .NET Compact Framework.&amp;#160; You should review those if your NetCF app uses the XmlSerializer.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=7212511" width="1" height="1"&gt;</content><author><name>andarno</name><uri>http://blogs.msdn.com/members/andarno.aspx</uri></author><category term="Mobile devices" scheme="http://blogs.msdn.com/andrewarnottms/archive/tags/Mobile+devices/default.aspx" /><category term="NetCF" scheme="http://blogs.msdn.com/andrewarnottms/archive/tags/NetCF/default.aspx" /></entry><entry><title>Using the XmlSerializer as an XmlObjectSerializer with WCF</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/andrewarnottms/archive/2008/01/18/using-the-xmlserializer-as-an-xmlobjectserializer-with-wcf.aspx" /><id>http://blogs.msdn.com/andrewarnottms/archive/2008/01/18/using-the-xmlserializer-as-an-xmlobjectserializer-with-wcf.aspx</id><published>2008-01-18T23:06:54Z</published><updated>2008-01-18T23:06:54Z</updated><content type="html">&lt;p&gt;The Windows Communication Foundation introduced the new DataContractSerializer to replace the XmlSerializer in many scenarios.&amp;#160; The DataContractSerializer is faster than the XmlSerializer, but has certain limitations.&amp;#160; For example it does not support serializing an object's members as XML attributes.&amp;#160; When you write a WCF client that calls a service, WCF will generate a proxy class that defaults to using the DataContractSerializer and falls back to the XmlSerializer if the service uses features that the DataContractSerializer does not support.&amp;#160; This fallback mechanism is automatic if you're using WCF's service model.&lt;/p&gt;  &lt;p&gt;But if you're working at WCF's messaging layer, you must explicitly choose which serializer to use.&amp;#160; You can use any serializer that derives from &lt;a href="http://msdn2.microsoft.com/en-us/library/system.runtime.serialization.xmlobjectserializer.aspx"&gt;System.Runtime.Serialization.XmlObjectSerializer&lt;/a&gt;.&amp;#160; &lt;a href="http://msdn2.microsoft.com/en-us/library/system.runtime.serialization.xmlobjectserializer.aspx"&gt;System.Runtime.Serialization.DataContractSerializer&lt;/a&gt; already derives from this class -- but &lt;a href="http://msdn2.microsoft.com/en-us/library/system.xml.serialization.xmlserializer.aspx"&gt;System.Xml.Serialization.XmlSerializer&lt;/a&gt; does &lt;em&gt;not&lt;/em&gt;.&amp;#160; So you have some work to do before you can use the XmlSerializer as your serializer of choice at the messaging layer of WCF.&lt;/p&gt;  &lt;p&gt;In order to use the XmlSerializer to send messages with WCF, we have to define a class that derives from XmlObjectSerializer and uses the XmlSerializer internally.&amp;#160; In essence we will create a wrapper class for the XmlSerializer that makes it look and work like an XmlObjectSerializer.&amp;#160; XmlObjectSerializer is an abstract class with only a few methods we need to implement.&amp;#160; &lt;/p&gt;  &lt;p&gt;Below is a sample of a class that will do just that.&lt;/p&gt; &lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; Microsoft.ServiceModel.Samples
{
    &lt;span class="kwrd"&gt;using&lt;/span&gt; System;
    &lt;span class="kwrd"&gt;using&lt;/span&gt; System.Diagnostics;
    &lt;span class="kwrd"&gt;using&lt;/span&gt; System.IO;
    &lt;span class="kwrd"&gt;using&lt;/span&gt; System.Text;
    &lt;span class="kwrd"&gt;using&lt;/span&gt; System.Xml;
    &lt;span class="kwrd"&gt;using&lt;/span&gt; System.Xml.Serialization;
    &lt;span class="kwrd"&gt;using&lt;/span&gt; System.Runtime.Serialization;

    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; CFMessagingSerializer : XmlObjectSerializer
    {
        &lt;span class="kwrd"&gt;readonly&lt;/span&gt; Type objectType;
        XmlSerializer serializer;

        &lt;span class="kwrd"&gt;public&lt;/span&gt; CFMessagingSerializer(Type objectType)
            : &lt;span class="kwrd"&gt;this&lt;/span&gt;(objectType, &lt;span class="kwrd"&gt;null&lt;/span&gt;, &lt;span class="kwrd"&gt;null&lt;/span&gt;)
        {
        }
        
        &lt;span class="kwrd"&gt;public&lt;/span&gt; CFMessagingSerializer(Type objectType, &lt;span class="kwrd"&gt;string&lt;/span&gt; wrapperName, &lt;span class="kwrd"&gt;string&lt;/span&gt; wrapperNamespace)
        {
            &lt;span class="kwrd"&gt;if&lt;/span&gt; (objectType == &lt;span class="kwrd"&gt;null&lt;/span&gt;)
                &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; ArgumentNullException(&lt;span class="str"&gt;&amp;quot;objectType&amp;quot;&lt;/span&gt;);
            &lt;span class="kwrd"&gt;if&lt;/span&gt; ((wrapperName == &lt;span class="kwrd"&gt;null&lt;/span&gt;) != (wrapperNamespace == &lt;span class="kwrd"&gt;null&lt;/span&gt;))
                &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; ArgumentException(&lt;span class="str"&gt;&amp;quot;wrapperName and wrapperNamespace must be either both null or both non-null.&amp;quot;&lt;/span&gt;);
            &lt;span class="kwrd"&gt;if&lt;/span&gt; (wrapperName == &lt;span class="kwrd"&gt;string&lt;/span&gt;.Empty)
                &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; ArgumentException(&lt;span class="str"&gt;&amp;quot;Cannot be the empty string.&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;wrapperName&amp;quot;&lt;/span&gt;);
            
            &lt;span class="kwrd"&gt;this&lt;/span&gt;.objectType = objectType;
            &lt;span class="kwrd"&gt;if&lt;/span&gt; (wrapperName != &lt;span class="kwrd"&gt;null&lt;/span&gt;)
            {
                XmlRootAttribute root = &lt;span class="kwrd"&gt;new&lt;/span&gt; XmlRootAttribute(wrapperName);
                root.Namespace = wrapperNamespace;
                &lt;span class="kwrd"&gt;this&lt;/span&gt;.serializer = &lt;span class="kwrd"&gt;new&lt;/span&gt; XmlSerializer(objectType, root);
            }
            &lt;span class="kwrd"&gt;else&lt;/span&gt;
                &lt;span class="kwrd"&gt;this&lt;/span&gt;.serializer = &lt;span class="kwrd"&gt;new&lt;/span&gt; XmlSerializer(objectType);
        }

        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; IsStartObject(XmlDictionaryReader reader)
        {
            &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; NotImplementedException();
        }

        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt; ReadObject(XmlDictionaryReader reader, &lt;span class="kwrd"&gt;bool&lt;/span&gt; verifyObjectName)
        {
            Debug.Assert(serializer != &lt;span class="kwrd"&gt;null&lt;/span&gt;);
            &lt;span class="kwrd"&gt;if&lt;/span&gt; (reader == &lt;span class="kwrd"&gt;null&lt;/span&gt;) &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; ArgumentNullException(&lt;span class="str"&gt;&amp;quot;reader&amp;quot;&lt;/span&gt;);
            &lt;span class="kwrd"&gt;if&lt;/span&gt; (!verifyObjectName)
                &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; NotSupportedException();

            &lt;span class="kwrd"&gt;return&lt;/span&gt; serializer.Deserialize(reader);
        }
        
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; WriteStartObject(XmlDictionaryWriter writer, &lt;span class="kwrd"&gt;object&lt;/span&gt; graph)
        {
            &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; NotImplementedException();
        }

        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; WriteObjectContent(XmlDictionaryWriter writer, &lt;span class="kwrd"&gt;object&lt;/span&gt; graph)
        {
            &lt;span class="kwrd"&gt;if&lt;/span&gt; (writer == &lt;span class="kwrd"&gt;null&lt;/span&gt;) &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; ArgumentNullException(&lt;span class="str"&gt;&amp;quot;writer&amp;quot;&lt;/span&gt;);
            &lt;span class="kwrd"&gt;if&lt;/span&gt; (writer.WriteState != WriteState.Element)
                &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; SerializationException(&lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;&amp;quot;WriteState '{0}' not valid. Caller must write start element before serializing in contentOnly mode.&amp;quot;&lt;/span&gt;,
                    writer.WriteState));
            &lt;span class="kwrd"&gt;using&lt;/span&gt; (MemoryStream memoryStream = &lt;span class="kwrd"&gt;new&lt;/span&gt; MemoryStream())
            {
                &lt;span class="kwrd"&gt;using&lt;/span&gt; (XmlDictionaryWriter bufferWriter = XmlDictionaryWriter.CreateTextWriter(memoryStream, Encoding.UTF8))
                {
                    serializer.Serialize(bufferWriter, graph);
                    bufferWriter.Flush();
                    memoryStream.Position = 0;
                    &lt;span class="kwrd"&gt;using&lt;/span&gt; (XmlReader reader = &lt;span class="kwrd"&gt;new&lt;/span&gt; XmlTextReader(memoryStream))
                    {
                        reader.MoveToContent();
                        writer.WriteAttributes(reader, &lt;span class="kwrd"&gt;false&lt;/span&gt;);
                        &lt;span class="kwrd"&gt;if&lt;/span&gt; (reader.Read()) &lt;span class="rem"&gt;// move off start node (we want to skip it)&lt;/span&gt;
                        {
                            &lt;span class="kwrd"&gt;while&lt;/span&gt; (reader.NodeType != XmlNodeType.EndElement) &lt;span class="rem"&gt;// also skip end node.&lt;/span&gt;
                                writer.WriteNode(reader, &lt;span class="kwrd"&gt;false&lt;/span&gt;); &lt;span class="rem"&gt;// this will take us to the start of the next child node, or the end node.&lt;/span&gt;
                            reader.ReadEndElement(); &lt;span class="rem"&gt;// not necessary, but clean&lt;/span&gt;
                        }
                    }
                }
            }
        }

        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; WriteEndObject(XmlDictionaryWriter writer)
        {
            &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; NotImplementedException();
        }
        
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; WriteObject(XmlDictionaryWriter writer, &lt;span class="kwrd"&gt;object&lt;/span&gt; graph)
        {
            Debug.Assert(serializer != &lt;span class="kwrd"&gt;null&lt;/span&gt;);
            &lt;span class="kwrd"&gt;if&lt;/span&gt; (writer == &lt;span class="kwrd"&gt;null&lt;/span&gt;) &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; ArgumentNullException(&lt;span class="str"&gt;&amp;quot;writer&amp;quot;&lt;/span&gt;);
            serializer.Serialize(writer, graph);
        }
    }
}&lt;/pre&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=7152596" width="1" height="1"&gt;</content><author><name>andarno</name><uri>http://blogs.msdn.com/members/andarno.aspx</uri></author><category term="Mobile devices" scheme="http://blogs.msdn.com/andrewarnottms/archive/tags/Mobile+devices/default.aspx" /><category term="NetCF" scheme="http://blogs.msdn.com/andrewarnottms/archive/tags/NetCF/default.aspx" /><category term="WCF" scheme="http://blogs.msdn.com/andrewarnottms/archive/tags/WCF/default.aspx" /></entry><entry><title>An impressive Silverlight Slideshow control</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/andrewarnottms/archive/2008/01/01/an-impressive-silverlight-slideshow-control.aspx" /><id>http://blogs.msdn.com/andrewarnottms/archive/2008/01/01/an-impressive-silverlight-slideshow-control.aspx</id><published>2008-01-01T18:31:00Z</published><updated>2008-01-01T18:31:00Z</updated><content type="html">&lt;p&gt;I recently discovered a very impressive (and free) Silverlight slideshow control.  I would recommend it over any Flash-based slideshow controls that I've seen so far (because this one's better--not just because I work here &amp;lt;g&amp;gt;)&lt;/p&gt;  &lt;p&gt;Here's a sample:&lt;/p&gt;   &lt;p align="center"&gt;  &lt;iframe src="http://code.nerdbank.net/firstfloor/iframe.aspx?url=http%3A//picasaweb.google.com/data/feed/base/user/andrewarnott/albumid/5139134563656594097%3Fkind%3Dphoto%26alt%3Drss%26hl%3Den_US&amp;amp;bgcolor=%23f3f2e2" marginwidth="0" marginheight="0" frameborder="0" height="388" scrolling="no" width="400"&gt;&lt;/iframe&gt;  &lt;/p&gt;     &lt;p&gt;Watch for a follow-up post on my &lt;a href="http://blog.nerdbank.net" mce_href="http://blog.nerdbank.net"&gt;JMPInline blog&lt;/a&gt; on the tricks I had to pull to get this Silverlight control working on Blogger while still pulling RSS photo feeds from &lt;a href="http://picasaweb.google.com" mce_href="http://picasaweb.google.com"&gt;PicasaWeb&lt;/a&gt;, despite the XSS-limitations imposed on Silverlight 1.0 controls.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=6937923" width="1" height="1"&gt;</content><author><name>andarno</name><uri>http://blogs.msdn.com/members/andarno.aspx</uri></author><category term="Silverlight" scheme="http://blogs.msdn.com/andrewarnottms/archive/tags/Silverlight/default.aspx" /></entry></feed>