<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;A0YHQHo9eyp7ImA9WhVUFUg.&quot;"><id>tag:blogger.com,1999:blog-158104178192097877</id><updated>2012-05-21T08:12:11.463+08:00</updated><category term="Team" /><category term="Visual Studio" /><category term="Performance" /><category term="Infrastructure" /><category term="Regular Expressions" /><category term="Errors" /><category term="Site Templates" /><category term="How-To" /><category term="Windows" /><category term="WMC" /><category term="Custom Field Controls" /><category term="ASP.NET" /><category term="Administration" /><category term="HTTP" /><category term="Web Development" /><category term="Book Reviews" /><category term="Flash" /><category term="Community" /><category term="RSS" /><category term="Networking" /><category term="Debugging" /><category term="MOSS" /><category term="Documentation" /><category term="Video" /><category term="SSP" /><category term="jQuery" /><category term="64-bit" /><category term="CSS" /><category term="Javascript" /><category term="Web Services" /><category term="XML" /><category term="Hyper-V" /><category term="SharePoint 2010" /><category term="IIS" /><category term="Presentations" /><category term="WSP Builder" /><category term="WSS" /><category term="Life" /><category term="Specific Business Domain Problems" /><category term="VoIP" /><category term="Upgrade" /><category term="Batch Files" /><category term="HTML" /><category term="SharePoint Designer" /><category term="Branding" /><category term="Process" /><category term="Installation" /><category term=".NET" /><category term="Meta" /><category term="Analytics" /><category term="Abstraction" /><category term="Microsoft" /><category term="Deployment" /><category term="SQL Server" /><category term="AJAX" /><category term="User Groups" /><category term="Management" /><category term="Security" /><category term="Web Content Management" /><category term="Best Practice" /><category term="Toolbox" /><category term="Opinion" /><category term="Browsers" /><category term="Web Design" /><category term="PowerShell" /><category term="thi" /><category term="Resources" /><category term="Things to Remember" /><category term="Links" /><category term="Tourism WA" /><category term="Web Parts" /><category term="SSL" /><category term="Virtualization" /><category term="Contracting" /><category term="Reusable Content" /><category term="Content" /><category term="Licensing" /><category term="List Programming" /><category term="Office" /><category term="TFS" /><category term="Software Development" /><category term="SharePoint" /><category term="Controls" /><category term="Jobs" /><category term="Workflow" /><category term="Caching" /><category term="Search" /><category term="C#" /><category term="Features" /><category term="SEO" /><category term="Database" /><category term="Active Directory" /><category term="Validation" /><category term="Tools" /><category term="Timezone" /><category term="Hardware" /><category term="IE" /><category term="Training" /><category term="Silverlight" /><title>Dirty Words</title><subtitle type="html">Copy/paste internet code kills.

Runtime comments on .net development, SharePoint WCM, and software engineering</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://blog.mediawhole.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://blog.mediawhole.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/158104178192097877/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Michael Hanes</name><uri>http://www.blogger.com/profile/01877569030107816208</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/-a7o_YpicYcQ/TqirMmZt3HI/AAAAAAAADiM/N8xoftyG-0k/s220/Michael%2BHanes%2BCropped%2B2.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>316</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/DirtyWords" /><feedburner:info uri="dirtywords" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;C0QBRngyeCp7ImA9Wx9aFks.&quot;"><id>tag:blogger.com,1999:blog-158104178192097877.post-1492385234850559934</id><published>2011-03-09T17:02:00.001+08:00</published><updated>2011-03-09T17:02:37.690+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-09T17:02:37.690+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Things to Remember" /><category scheme="http://www.blogger.com/atom/ns#" term="ASP.NET" /><category scheme="http://www.blogger.com/atom/ns#" term="Debugging" /><title>VS Remote Debugger: Invalid access to memory location</title><content type="html">&lt;p&gt;I've been running my Visual Studio 2010 remote debugger &lt;a href="http://blog.mediawhole.com/2011/01/how-to-run-visual-studio-remote.html"&gt;as a service&lt;/a&gt; for a while now and found the experience to be generally seamless. Every so often, however, things go pear-shaped and Visual Studio throws up it arms when attempting to connect to the remote machine:&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Unable to connect to the Microsoft Visual Studio Remote Debugging Monitor named 'my-dev-env'. Invalid access to memory location.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_kuHIq0i1UO4/TXdCKdrcKOI/AAAAAAAADec/MbFXv02GgLY/s1600-h/VS-invalid-access-memory%5B4%5D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="VS-invalid-access-memory" border="0" alt="VS-invalid-access-memory" src="http://lh6.ggpht.com/_kuHIq0i1UO4/TXdCLJ1eNpI/AAAAAAAADeg/CRwUTHxfQgA/VS-invalid-access-memory_thumb%5B2%5D.png?imgmax=800" width="356" height="120" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;I've found the only way to correct this is by restarting Visual Studio. &lt;/p&gt; &lt;center&gt;If you found this post helpful, please support my advertisers. &lt;/center&gt;&lt;center&gt;   &lt;table&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td&gt;&lt;script type="text/javascript" src="http://sharepointads.com/members/scripts/banner.php?a_aid=NA&amp;amp;a_bid=cde7edc2"&gt;&lt;/script&gt;&lt;/td&gt;          &lt;td&gt;&lt;script type="text/javascript" src="http://sharepointads.com/members/scripts/banner.php?a_aid=NA&amp;amp;a_bid=48840e1d"&gt;&lt;/script&gt;&lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/center&gt;  &lt;div class="blogger-post-footer"&gt;Dirty Words (Michael Hanes) - &lt;a href="http://blog.mediawhole.com"&gt;blog.mediawhole.com&lt;/a&gt;
&lt;a href="mailto:info@mediawole.com"&gt;mailto:info@mediawole.com&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/158104178192097877-1492385234850559934?l=blog.mediawhole.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DirtyWords?a=yIem-PVWud4:369elJorgk0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DirtyWords?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DirtyWords?a=yIem-PVWud4:369elJorgk0:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DirtyWords?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DirtyWords/~4/yIem-PVWud4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.mediawhole.com/feeds/1492385234850559934/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.mediawhole.com/2011/03/vs-remote-debugger-invalid-access-to.html#comment-form" title="13 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/158104178192097877/posts/default/1492385234850559934?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/158104178192097877/posts/default/1492385234850559934?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DirtyWords/~3/yIem-PVWud4/vs-remote-debugger-invalid-access-to.html" title="VS Remote Debugger: Invalid access to memory location" /><author><name>Michael Hanes</name><uri>http://www.blogger.com/profile/01877569030107816208</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/-a7o_YpicYcQ/TqirMmZt3HI/AAAAAAAADiM/N8xoftyG-0k/s220/Michael%2BHanes%2BCropped%2B2.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/_kuHIq0i1UO4/TXdCLJ1eNpI/AAAAAAAADeg/CRwUTHxfQgA/s72-c/VS-invalid-access-memory_thumb%5B2%5D.png?imgmax=800" height="72" width="72" /><thr:total>13</thr:total><feedburner:origLink>http://blog.mediawhole.com/2011/03/vs-remote-debugger-invalid-access-to.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUECQHoyfCp7ImA9Wx9aEU8.&quot;"><id>tag:blogger.com,1999:blog-158104178192097877.post-2942017152176330944</id><published>2011-03-03T11:41:00.001+08:00</published><updated>2011-03-03T11:41:01.494+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-03T11:41:01.494+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Administration" /><category scheme="http://www.blogger.com/atom/ns#" term="Things to Remember" /><category scheme="http://www.blogger.com/atom/ns#" term="How-To" /><category scheme="http://www.blogger.com/atom/ns#" term="Active Directory" /><title>How to determine where an Active Directory object lives</title><content type="html">&lt;p&gt;Active Directory's Find… function is pretty handy: by searching from the directory root or any OU, you can search for specific objects by name, etc. &lt;/p&gt;  &lt;p&gt;Unfortunately the search results display is a bit barebones and it's never obvious to a non-AD admin like me how to determine where the object actually lives in the hierarchy. Luckily you can drill into a search result item to view an object's properties but unless you're a real AD keener, you still might know how to find the object's location. &lt;/p&gt;  &lt;p&gt;To rectify this situation, you'll need to turn on the &lt;strong&gt;Advanced Features&lt;/strong&gt; setting from the Active Directory Users and Computers snap-in's View menu:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_kuHIq0i1UO4/TW8NwS4daII/AAAAAAAADeI/hhivNJt0fz0/s1600-h/Active%20Directory%20Advanced%20Features%5B3%5D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="Active Directory Advanced Features" border="0" alt="Active Directory Advanced Features" src="http://lh5.ggpht.com/_kuHIq0i1UO4/TW8NxAxBO6I/AAAAAAAADeM/CsSHiRq3U5U/Active%20Directory%20Advanced%20Features_thumb%5B1%5D.png?imgmax=800" width="285" height="173" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The object properties display will now include an Object tab which contains the Canonical name of object field (in other words, the path to the object within the directory):&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_kuHIq0i1UO4/TW8NxzgkFhI/AAAAAAAADeQ/mQnWJOeB2Ao/s1600-h/Active%20Directory%20Object%20Sheet%5B3%5D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="Active Directory Object Sheet" border="0" alt="Active Directory Object Sheet" src="http://lh4.ggpht.com/_kuHIq0i1UO4/TW8NzG4IADI/AAAAAAAADeU/YyFyNyhvSH8/Active%20Directory%20Object%20Sheet_thumb%5B1%5D.png?imgmax=800" width="319" height="305" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;center&gt;If you found this post helpful, please support my advertisers. &lt;/center&gt;&lt;center&gt;   &lt;table&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td&gt;&lt;script type="text/javascript" src="http://sharepointads.com/members/scripts/banner.php?a_aid=NA&amp;amp;a_bid=cde7edc2"&gt;&lt;/script&gt;&lt;/td&gt;          &lt;td&gt;&lt;script type="text/javascript" src="http://sharepointads.com/members/scripts/banner.php?a_aid=NA&amp;amp;a_bid=48840e1d"&gt;&lt;/script&gt;&lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/center&gt;  &lt;div class="blogger-post-footer"&gt;Dirty Words (Michael Hanes) - &lt;a href="http://blog.mediawhole.com"&gt;blog.mediawhole.com&lt;/a&gt;
&lt;a href="mailto:info@mediawole.com"&gt;mailto:info@mediawole.com&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/158104178192097877-2942017152176330944?l=blog.mediawhole.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DirtyWords?a=EyfFZhDPLQw:SBXatMzeLhA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DirtyWords?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DirtyWords?a=EyfFZhDPLQw:SBXatMzeLhA:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DirtyWords?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DirtyWords/~4/EyfFZhDPLQw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.mediawhole.com/feeds/2942017152176330944/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.mediawhole.com/2011/03/how-to-determine-where-active-directory.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/158104178192097877/posts/default/2942017152176330944?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/158104178192097877/posts/default/2942017152176330944?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DirtyWords/~3/EyfFZhDPLQw/how-to-determine-where-active-directory.html" title="How to determine where an Active Directory object lives" /><author><name>Michael Hanes</name><uri>http://www.blogger.com/profile/01877569030107816208</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/-a7o_YpicYcQ/TqirMmZt3HI/AAAAAAAADiM/N8xoftyG-0k/s220/Michael%2BHanes%2BCropped%2B2.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/_kuHIq0i1UO4/TW8NxAxBO6I/AAAAAAAADeM/CsSHiRq3U5U/s72-c/Active%20Directory%20Advanced%20Features_thumb%5B1%5D.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.mediawhole.com/2011/03/how-to-determine-where-active-directory.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEAFQngzfCp7ImA9Wx9bEko.&quot;"><id>tag:blogger.com,1999:blog-158104178192097877.post-8785504283161037934</id><published>2011-02-15T18:18:00.000+08:00</published><updated>2011-02-21T15:18:33.684+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-21T15:18:33.684+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Things to Remember" /><category scheme="http://www.blogger.com/atom/ns#" term="Web Development" /><category scheme="http://www.blogger.com/atom/ns#" term="SharePoint" /><category scheme="http://www.blogger.com/atom/ns#" term="Custom Field Controls" /><category scheme="http://www.blogger.com/atom/ns#" term="ASP.NET" /><category scheme="http://www.blogger.com/atom/ns#" term="Controls" /><category scheme="http://www.blogger.com/atom/ns#" term="How-To" /><category scheme="http://www.blogger.com/atom/ns#" term="Web Parts" /><title>How to reference a user control deployed to the GAC</title><content type="html">&lt;p&gt;&lt;em&gt;Warning: I don't consider myself a control developer in the classic sense (although I frequently write web parts for deployment within a SharePoint environment, the scope of that deployment is fairly small by default). &lt;/em&gt;&lt;/p&gt;  &lt;p&gt;A lot of the functionality I build these days runs client-side, powered by my all-time best friend jQuery. Because of this, I find I'm most productive when I first establish the HTML structure in a static HTML file before moving the mark-up to a control. In the bad old days of complete ignorance, I would have had refactor this HTML and build it programmatically within a custom control—an approach I despise (HTML belongs in mark-up). &lt;/p&gt;  &lt;p&gt;To overcome many of the drawbacks to custom control development, I prefer migrating my prototype to a user control (which has a front-end .ascx file) and then loading that control in my web part code-behind or custom field control. Check out the &lt;a href="http://msdn.microsoft.com/en-us/library/system.web.ui.templatecontrol.loadcontrol.aspx"&gt;LoadControl&lt;/a&gt; documentation for information about how load a user control programmatically.&lt;/p&gt;  &lt;p&gt;This works beautifully when the control's code behind is compiled to an assembly destined for deployment to the private bin directory. The user control can be built in isolation with the ascx file and code behind remaining wired up for easy access to Intellisense, etc. At build time, the .ascx file is copied somewhere and deployed somewhere useful (the CONTROLTEMPLATES virtual directory, if you like). &lt;/p&gt;  &lt;p&gt;Things get trickier when that assembly is to be deployed to the global assembly cache (aka the GAC). In my case I wanted to do this for a custom field control; although most of the code for that control was already being deployed to the GAC, it made sense to keep these artefacts together in the same project. For my non-SharePoint readers, any assembly going into the GAC has to be strong named and signed (via the project's properties sheet &amp;gt; Signing tab); to add the assembly to the GAC, call gacutil:&lt;/p&gt;  &lt;p&gt;gacutil –i &amp;quot;MyAsemblyName.dll&amp;quot;&lt;/p&gt;  &lt;p&gt;With that out of the way, assume we've got two projects: the first (MyControls) is a class library outputting a signed assembly intended for the GAC; the second is a simple web site (Web). &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_kuHIq0i1UO4/TVobXcpdiUI/AAAAAAAADdw/7sikuuspfWI/s1600-h/GAC_User_Control_sln%5B2%5D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="GAC_User_Control_sln" border="0" alt="GAC_User_Control_sln" src="http://lh4.ggpht.com/_kuHIq0i1UO4/TVobYJIRgSI/AAAAAAAADd0/PvDKPeZOhLo/GAC_User_Control_sln_thumb.png?imgmax=800" width="203" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The MyControls project contains our user control (for information about how to set this up, refer to my post &lt;a href="http://blog.mediawhole.com/2010/06/how-to-add-web-project-item-to-class.html"&gt;How to add a web project item to a class library&lt;/a&gt;). The MyControls assembly is deployed to the GAC. &lt;/p&gt;  &lt;p&gt;The web site project contains a copy of the .ascx user control file from the MyControls project and a web page with a @ Register directive pointing to the project-local .ascx file. The Web project doesn't reference the MyControls project because we want it to load the assembly it depends on from the GAC. The .ascx copy can be done manually but you'll likely want to automate this as a pre-build task.&lt;/p&gt;  &lt;p&gt;While the MyControls project will now compile, the Web site project will fail to compile with the error: Could not load type 'MyControls.MyUserControl'. If you're in a SharePoint environment, you'll likely see get this as a parser error when the page is dynamically compiled at first request. &lt;/p&gt;  &lt;p&gt;To fix this, you need to add an @ Assembly directive to the top of the .ascx file to reference the MyControls assembly deployed to the GAC. You'll need the assembly name and public key token to flesh out this directive. The assembly name can be retrieved from the project properties sheet (normally it's the same as the project anyway). Then extract the public key token using the strong name application (it's the short value): &lt;/p&gt;  &lt;p&gt;sn –Tp &amp;quot;MyControls.dll&amp;quot;&lt;/p&gt;  &lt;p&gt;If your AssemblyInfo.cs specifies a version number of 1.0.0.0, your @ Assembly directive should look something like this:&lt;/p&gt;  &lt;p&gt;&amp;lt;%@ Assembly Name=&amp;quot;MyControls, Version=1.0.0.0, Culture=Neutral, PublicKeyToken=b3de351d91c5d4d2&amp;quot;%&amp;gt;&lt;/p&gt;  &lt;p&gt;If you version numbers are automatically updated by some kind of policy or build event, beware you'll also need to update this directive as well, which may prove cumbersome. &lt;/p&gt;  &lt;p&gt;This directive can be added to both copies of the .ascx file without impacting the MyControls build or edit-time experience. &lt;/p&gt;  &lt;p&gt;Both projects will now compile and run, successfully loading the user control base type (i.e. the code behind) from the GAC. &lt;/p&gt;  &lt;p&gt;You can download this solution &lt;a href="https://sites.google.com/a/mediawhole.com/www/GACDeployed.zip?attredirects=0&amp;amp;d=1"&gt;here&lt;/a&gt;.&lt;/p&gt; &lt;center&gt;If you found this post helpful, please support my advertisers. &lt;/center&gt;&lt;center&gt;   &lt;table&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td&gt;&lt;script type="text/javascript" src="http://sharepointads.com/members/scripts/banner.php?a_aid=NA&amp;amp;a_bid=cde7edc2"&gt;&lt;/script&gt;&lt;/td&gt;          &lt;td&gt;&lt;script type="text/javascript" src="http://sharepointads.com/members/scripts/banner.php?a_aid=NA&amp;amp;a_bid=48840e1d"&gt;&lt;/script&gt;&lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/center&gt;  &lt;div class="blogger-post-footer"&gt;Dirty Words (Michael Hanes) - &lt;a href="http://blog.mediawhole.com"&gt;blog.mediawhole.com&lt;/a&gt; &lt;a href="mailto:info@mediawole.com"&gt;mailto:info@mediawole.com&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;Dirty Words (Michael Hanes) - &lt;a href="http://blog.mediawhole.com"&gt;blog.mediawhole.com&lt;/a&gt;
&lt;a href="mailto:info@mediawole.com"&gt;mailto:info@mediawole.com&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/158104178192097877-8785504283161037934?l=blog.mediawhole.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DirtyWords?a=C6_8RENB6HU:91-AVpr1TiY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DirtyWords?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DirtyWords?a=C6_8RENB6HU:91-AVpr1TiY:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DirtyWords?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DirtyWords/~4/C6_8RENB6HU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.mediawhole.com/feeds/8785504283161037934/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.mediawhole.com/2011/02/how-to-reference-user-control-deployed.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/158104178192097877/posts/default/8785504283161037934?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/158104178192097877/posts/default/8785504283161037934?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DirtyWords/~3/C6_8RENB6HU/how-to-reference-user-control-deployed.html" title="How to reference a user control deployed to the GAC" /><author><name>Michael Hanes</name><uri>http://www.blogger.com/profile/01877569030107816208</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/-a7o_YpicYcQ/TqirMmZt3HI/AAAAAAAADiM/N8xoftyG-0k/s220/Michael%2BHanes%2BCropped%2B2.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/_kuHIq0i1UO4/TVobYJIRgSI/AAAAAAAADd0/PvDKPeZOhLo/s72-c/GAC_User_Control_sln_thumb.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.mediawhole.com/2011/02/how-to-reference-user-control-deployed.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0IARXk9eCp7ImA9Wx9UEk8.&quot;"><id>tag:blogger.com,1999:blog-158104178192097877.post-8333537489637124296</id><published>2011-02-09T12:24:00.001+08:00</published><updated>2011-02-09T12:25:44.760+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-09T12:25:44.760+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="TFS" /><category scheme="http://www.blogger.com/atom/ns#" term="Debugging" /><category scheme="http://www.blogger.com/atom/ns#" term="Installation" /><category scheme="http://www.blogger.com/atom/ns#" term="How-To" /><category scheme="http://www.blogger.com/atom/ns#" term="Office" /><title>Cannot open a TFS query in Excel</title><content type="html">&lt;p&gt;After successfully upgrading from VS2008/TFS2008 to VS2010/TFS2010 in the last few months, I today realised my machine still had an outstanding issue opening TFS queries from Visual Studio in Excel . After running the query in VS and clicking Open in Microsoft Office –&amp;gt; Open Query in Microsoft Excel, I was the reluctant recipient of this error message and no Excel openage:&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&lt;font color="#ff0000"&gt;Team Foundation Error&lt;/font&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&lt;font color="#ff0000"&gt;TF80012: The document cannot be opened because there is a problem with the installation of the Microsoft Visual Studio v10.0 Team Foundation Office integration components.&amp;#160; Please see the Team Foundation Installation Guide for more information.&lt;/font&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;While a number of solutions were offered, what follows is the complete set of steps I followed to fix the problem in my workstation environment (Windows Server 2008 R2 x64 with Office 2010 x86 and VS2010 RTM + TFS bits):&lt;/p&gt;  &lt;p&gt;1. I first repaired Microsoft Visual Studio 2010 Ultimate from Control Panel. This took a while and required a restart of my workstation. All of my extensions and settings were retained (I think). On its own, this didn't fix the problem but others have reported is did for them. &lt;/p&gt;  &lt;p&gt;2. From a command prompt running as administrator (I'm in the local administrators on my machine but that's not good enough), I re-registered the TFSOfficeAdd-in.dll. I only ran the x86 command because VS2010 is a 32-bit app and I'm running the 32-bit version of Office on Windows x64; while the same assembly exists in the 64-bit Program Files directory, I'm assuming it's for the 64-bit version of Office 2010 (just guessing): &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;regsvr32 &amp;quot;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\PrivateAssemblies\TFSOfficeAdd-in.dll&amp;quot; &lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;3. Starting Excel from that same command window to ensure Excel started as an admin, I removed the v9.0 Team Foundation Add-In since I noticed it was showing alongside the v10.0 add-in and I wasn't sure if it was wreaking havoc. At this point, the Team menu was visible in Excel when running as admin but not when running as myself. In Excel 2010, you can manage add-ins from the File –&amp;gt; Options menu; click the Add-Ins tab and then choose COM Add-Ins from the Manage drop down. &lt;/p&gt;  &lt;p&gt;4. I finally opened Excel again as myself and enabled the Team Foundation Add-In (v10.0). The Team menu now appeared in Excel.&lt;/p&gt;  &lt;p&gt;At this point I can now open a TFS query in Excel. &lt;/p&gt;  &lt;p&gt;Note, others have suggested deleting their Windows profile solved the problem for them, at the cost of deleting all of their settings, My Documents, etc. If you go down that path, be careful!&lt;/p&gt; &lt;center&gt;If you found this post helpful, please support my advertisers. &lt;/center&gt;&lt;center&gt;   &lt;table&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td&gt;&lt;script type="text/javascript" src="http://sharepointads.com/members/scripts/banner.php?a_aid=NA&amp;amp;a_bid=cde7edc2"&gt;&lt;/script&gt;&lt;/td&gt;          &lt;td&gt;&lt;script type="text/javascript" src="http://sharepointads.com/members/scripts/banner.php?a_aid=NA&amp;amp;a_bid=48840e1d"&gt;&lt;/script&gt;&lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/center&gt;  &lt;div class="blogger-post-footer"&gt;Dirty Words (Michael Hanes) - &lt;a href="http://blog.mediawhole.com"&gt;blog.mediawhole.com&lt;/a&gt;
&lt;a href="mailto:info@mediawole.com"&gt;mailto:info@mediawole.com&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/158104178192097877-8333537489637124296?l=blog.mediawhole.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DirtyWords?a=NzQ65dqFyhc:t3OOGsssWiM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DirtyWords?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DirtyWords?a=NzQ65dqFyhc:t3OOGsssWiM:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DirtyWords?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DirtyWords/~4/NzQ65dqFyhc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.mediawhole.com/feeds/8333537489637124296/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.mediawhole.com/2011/02/cannot-open-tfs-query-in-excel.html#comment-form" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/158104178192097877/posts/default/8333537489637124296?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/158104178192097877/posts/default/8333537489637124296?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DirtyWords/~3/NzQ65dqFyhc/cannot-open-tfs-query-in-excel.html" title="Cannot open a TFS query in Excel" /><author><name>Michael Hanes</name><uri>http://www.blogger.com/profile/01877569030107816208</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/-a7o_YpicYcQ/TqirMmZt3HI/AAAAAAAADiM/N8xoftyG-0k/s220/Michael%2BHanes%2BCropped%2B2.jpg" /></author><thr:total>4</thr:total><feedburner:origLink>http://blog.mediawhole.com/2011/02/cannot-open-tfs-query-in-excel.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkcGRnwzeip7ImA9Wx9UEUg.&quot;"><id>tag:blogger.com,1999:blog-158104178192097877.post-5210586546647141491</id><published>2011-02-08T16:33:00.001+08:00</published><updated>2011-02-08T16:33:47.282+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-08T16:33:47.282+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="64-bit" /><category scheme="http://www.blogger.com/atom/ns#" term="Windows" /><category scheme="http://www.blogger.com/atom/ns#" term="Installation" /><category scheme="http://www.blogger.com/atom/ns#" term="Networking" /><title>Windows Server 2003 x64 on Hyper-V Driver Issues</title><content type="html">&lt;p&gt;Installing the 64-bit version of Windows Server 2003 requires service pack 2 and installation of the Hyper-V Integration Services. &lt;/p&gt;  &lt;p&gt;Before upgrading RTM and installing the integration services, one of guys was having a bear of a time getting the network&amp;#160; card to appear in the guest. &lt;/p&gt; &lt;center&gt;If you found this post helpful, please support my advertisers. &lt;/center&gt;&lt;center&gt;   &lt;table&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td&gt;&lt;script type="text/javascript" src="http://sharepointads.com/members/scripts/banner.php?a_aid=NA&amp;amp;a_bid=cde7edc2"&gt;&lt;/script&gt;&lt;/td&gt;          &lt;td&gt;&lt;script type="text/javascript" src="http://sharepointads.com/members/scripts/banner.php?a_aid=NA&amp;amp;a_bid=48840e1d"&gt;&lt;/script&gt;&lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/center&gt;  &lt;div class="blogger-post-footer"&gt;Dirty Words (Michael Hanes) - &lt;a href="http://blog.mediawhole.com"&gt;blog.mediawhole.com&lt;/a&gt;
&lt;a href="mailto:info@mediawole.com"&gt;mailto:info@mediawole.com&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/158104178192097877-5210586546647141491?l=blog.mediawhole.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DirtyWords?a=7m4TU0Ml7fI:M7t9AzXsZmg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DirtyWords?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DirtyWords?a=7m4TU0Ml7fI:M7t9AzXsZmg:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DirtyWords?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DirtyWords/~4/7m4TU0Ml7fI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.mediawhole.com/feeds/5210586546647141491/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.mediawhole.com/2011/02/windows-server-2003-x64-on-hyper-v.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/158104178192097877/posts/default/5210586546647141491?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/158104178192097877/posts/default/5210586546647141491?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DirtyWords/~3/7m4TU0Ml7fI/windows-server-2003-x64-on-hyper-v.html" title="Windows Server 2003 x64 on Hyper-V Driver Issues" /><author><name>Michael Hanes</name><uri>http://www.blogger.com/profile/01877569030107816208</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/-a7o_YpicYcQ/TqirMmZt3HI/AAAAAAAADiM/N8xoftyG-0k/s220/Michael%2BHanes%2BCropped%2B2.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.mediawhole.com/2011/02/windows-server-2003-x64-on-hyper-v.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU8FSHo4fyp7ImA9Wx9UEUg.&quot;"><id>tag:blogger.com,1999:blog-158104178192097877.post-1195015175196871124</id><published>2011-02-08T14:17:00.001+08:00</published><updated>2011-02-08T16:30:19.437+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-08T16:30:19.437+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Things to Remember" /><category scheme="http://www.blogger.com/atom/ns#" term="Video" /><category scheme="http://www.blogger.com/atom/ns#" term="Tools" /><category scheme="http://www.blogger.com/atom/ns#" term="Flash" /><title>Inspecting video and audio files</title><content type="html">&lt;p&gt;I've been using a handy little tool called &lt;a href="http://mediainfo.sourceforge.net/en"&gt;MediaInfo&lt;/a&gt; to inspect some of the .flv files we display in the westernaustralia.com banner space and diagnose encoding differences. &lt;/p&gt;  &lt;p&gt;The free tool displays all sorts of information about the audio and video streams:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_kuHIq0i1UO4/TVDgET7nnmI/AAAAAAAADdo/zoyVntk339g/s1600-h/MediaInfo%5B3%5D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="MediaInfo" border="0" alt="MediaInfo" src="http://lh3.ggpht.com/_kuHIq0i1UO4/TVDgFBgeJkI/AAAAAAAADds/7oXCHSDzD6s/MediaInfo_thumb%5B1%5D.png?imgmax=800" width="387" height="218" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;center&gt;If you found this post helpful, please support my advertisers. &lt;/center&gt;&lt;center&gt;   &lt;table&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td&gt;&lt;script type="text/javascript" src="http://sharepointads.com/members/scripts/banner.php?a_aid=NA&amp;amp;a_bid=cde7edc2"&gt;&lt;/script&gt;&lt;/td&gt;          &lt;td&gt;&lt;script type="text/javascript" src="http://sharepointads.com/members/scripts/banner.php?a_aid=NA&amp;amp;a_bid=48840e1d"&gt;&lt;/script&gt;&lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/center&gt;  &lt;div class="blogger-post-footer"&gt;Dirty Words (Michael Hanes) - &lt;a href="http://blog.mediawhole.com"&gt;blog.mediawhole.com&lt;/a&gt;
&lt;a href="mailto:info@mediawole.com"&gt;mailto:info@mediawole.com&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/158104178192097877-1195015175196871124?l=blog.mediawhole.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DirtyWords?a=B2s8ATF53gs:57BmrbEoIKE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DirtyWords?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DirtyWords?a=B2s8ATF53gs:57BmrbEoIKE:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DirtyWords?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DirtyWords/~4/B2s8ATF53gs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.mediawhole.com/feeds/1195015175196871124/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.mediawhole.com/2011/02/inspecting-video-and-audio-files.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/158104178192097877/posts/default/1195015175196871124?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/158104178192097877/posts/default/1195015175196871124?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DirtyWords/~3/B2s8ATF53gs/inspecting-video-and-audio-files.html" title="Inspecting video and audio files" /><author><name>Michael Hanes</name><uri>http://www.blogger.com/profile/01877569030107816208</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/-a7o_YpicYcQ/TqirMmZt3HI/AAAAAAAADiM/N8xoftyG-0k/s220/Michael%2BHanes%2BCropped%2B2.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/_kuHIq0i1UO4/TVDgFBgeJkI/AAAAAAAADds/7oXCHSDzD6s/s72-c/MediaInfo_thumb%5B1%5D.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.mediawhole.com/2011/02/inspecting-video-and-audio-files.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkMHSX8yeCp7ImA9Wx9WFEw.&quot;"><id>tag:blogger.com,1999:blog-158104178192097877.post-3085311436171550163</id><published>2011-01-19T14:27:00.001+08:00</published><updated>2011-01-19T14:27:18.190+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-01-19T14:27:18.190+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Things to Remember" /><category scheme="http://www.blogger.com/atom/ns#" term="TFS" /><category scheme="http://www.blogger.com/atom/ns#" term="XML" /><category scheme="http://www.blogger.com/atom/ns#" term="PowerShell" /><category scheme="http://www.blogger.com/atom/ns#" term="Installation" /><category scheme="http://www.blogger.com/atom/ns#" term="How-To" /><category scheme="http://www.blogger.com/atom/ns#" term="Process" /><title>Centralising global TFS alerts/notifications</title><content type="html">&lt;p&gt;TFS email alerts are critical to keeping your team informed about changes in the TFS projects they care about. At the very least, most users probably want to know when they've been assigned a work item. &lt;/p&gt;  &lt;p&gt;Although Visual Studio 2010 includes the Alerts Explorer (Team –&amp;gt; Alerts Explorer) for signing yourself up for alerts, there's no obvious way to do the same thing for a group of users. Adding custom business logic into the mix really means you'll need to find a better alternative.&lt;/p&gt;  &lt;p&gt;Behold! My latest Codeplex project is live, I call it TFS Global Alerts:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://tfsalerts.codeplex.com/"&gt;http://tfsalerts.codeplex.com/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;When we last faced this problem with Visual Studio Team System 2008, we landed on a solution from &lt;a href="http://www.vertigo.com"&gt;vertigo.com&lt;/a&gt;--I'd link to the original blog post but it's been removed from the site. Moving forward a few years, it was recently time to &lt;a href="http://blog.mediawhole.com/2010/04/how-to-do-test-tfs-2008-migration-to.html"&gt;upgrade our TFS 2008 install&lt;/a&gt; to TFS 2010 and the question naturally arose about what we do with alerts: continue using the Vertigo web service or not?&lt;/p&gt;  &lt;p&gt;The custom logic originally added to the Vertigo solution was flailing a bit due to the kludge of time so we decided to refactor the current solution to better meet our needs and keep everything working with TFS 2010. I've uploaded a generalised version of the end result for your alerting enjoyment as an example of handling TFS events in a web service (you may want to follow the links below for alternatives based on Windows services and event listeners).&lt;/p&gt;  &lt;h4&gt;The Solution&lt;/h4&gt;  &lt;p&gt;TFS Global Alerts is, at its core, a web service containing a single public method:&lt;/p&gt;  &lt;p&gt;[WebMethod]    &lt;br /&gt;public void Notify (string eventXml)&lt;/p&gt;  &lt;p&gt;Notify() accepts a single parameter, a string containing XML detailing the change that occurred and some information about the work item itself. The Notify() method signature changed slightly from TFS 2008: it previously included a second string parameter, tfsIdentityXml. I removed this parameter to get things wired up successfully with TFS 2010.&lt;/p&gt;  &lt;p&gt;Most elements in the eventXml look a bit like this—note the OldValue and NewValue child elements: &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&amp;lt;Field&amp;gt;      &lt;br /&gt;&amp;lt;Name&amp;gt;State&amp;lt;/Name&amp;gt;       &lt;br /&gt;&amp;lt;ReferenceName&amp;gt;System.State&amp;lt;/ReferenceName&amp;gt;       &lt;br /&gt;&amp;lt;OldValue&amp;gt;Active&amp;lt;/OldValue&amp;gt;       &lt;br /&gt;&amp;lt;NewValue&amp;gt;Resolved&amp;lt;/NewValue&amp;gt;       &lt;br /&gt;&amp;lt;/Field&amp;gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;With the Notify() method called and most of the data you need at hand, sending an email to the relevant parties is then quite simple. TFS Global Alerts does some additional work to exclude the person who made the change from receiving a notification about that change (presumably they know what they've just done!) and avoid sending notifications about code check-ins linked to a work item. &lt;/p&gt;  &lt;p&gt;The only real complexity in this code is retrieving an email address for each user from Active Directory. In our production environment I found TFS listed users by display name however in development, with TFS running as a service account in the dev domain, users were returned as domain\username. In production, if a user had multiple accounts (some of our admins), their name was returned as &amp;quot;First Last (domain\username)&amp;quot;.&lt;/p&gt;  &lt;p&gt;In terms of deployment, I simply deploy the web service to the web server hosting TFS itself and TFS web access.&lt;/p&gt;  &lt;p&gt;The notification system hangs off TFS' own event subscription tool, bissubscribe.exe (you'll find it at C:\Program Files\Microsoft Team Foundation Server 2010\Tools\bissubscribe.exe). TFS raises events for all sorts of different happenings and bissubscribe.exe allows you to subscribe an email address or SOAP web service to handle those events. &lt;/p&gt;  &lt;p&gt;Since I had some problems creating a server-level subscription, here's the command I use to create a project collection subscription (which captures all events in our case):&lt;/p&gt;  &lt;p&gt;bissubscribe /eventType WorkItemChangedEvent /address http://localhost:8080/{vdir_path}/Alerts/WorkItemChanged.asmx /collection &lt;a href="http://localhost:8080/tfs/{project_collection_name"&gt;http://localhost:8080/tfs/{project_collection_name&lt;/a&gt;}     &lt;br /&gt;    &lt;br /&gt;Result:&lt;/p&gt;  &lt;p&gt;TF50001:&amp;#160; Created or found an existing subscription. The subscription ID is 36&lt;/p&gt;  &lt;h4&gt;Debugging&lt;/h4&gt;  &lt;p&gt;TFS 2010 only sends alerts every two minutes by default and events subscribed to via bissubscribe.exe adhere to the same policy. This can be a bit annoying when you're developing so you may want to dial down the batch wait time. I've included a Powershell script in the solution to configure this but otherwise, check out chrisid's &lt;a href="http://blogs.msdn.com/b/chrisid/archive/2010/03/05/faster-delivery-of-notifications.aspx"&gt;post on the subject&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;For additional help debugging bissubscribe, Grant Holliday has some useful &lt;a href="http://blogs.msdn.com/b/granth/archive/2009/10/28/tfs2010-diagnosing-email-and-soap-subscription-failures.aspx"&gt;tips&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Finally, don't forget to actually &lt;a href="http://fredmastro.com/post/Configure-TFS-2010-Email-Server-Enable-Email-Alerts.aspx"&gt;configure&lt;/a&gt; your TFS server to send email!&lt;/p&gt;  &lt;h4&gt;Resources&lt;/h4&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.codeproject.com/KB/vb/TFS_Event_Handler.aspx"&gt;Creating your own event handler for the TFS Event Handler Service&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://tfseventhandler.codeplex.com/"&gt;TFS Event Handler (Codeplex project)&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://blog.hinshelwood.com/archive/2010/07/07/tfs-event-handler-for-team-foundation-server-2010.aspx"&gt;TFS Event Handler for Team Foundation Server 2010&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/magazine/cc507647.aspx"&gt;Team Foundation Server Event Service&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt; &lt;center&gt;If you found this post helpful, please support my advertisers. &lt;/center&gt;&lt;center&gt;   &lt;table&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td&gt;&lt;script type="text/javascript" src="http://sharepointads.com/members/scripts/banner.php?a_aid=NA&amp;amp;a_bid=cde7edc2"&gt;&lt;/script&gt;&lt;/td&gt;          &lt;td&gt;&lt;script type="text/javascript" src="http://sharepointads.com/members/scripts/banner.php?a_aid=NA&amp;amp;a_bid=48840e1d"&gt;&lt;/script&gt;&lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/center&gt;  &lt;div class="blogger-post-footer"&gt;Dirty Words (Michael Hanes) - &lt;a href="http://blog.mediawhole.com"&gt;blog.mediawhole.com&lt;/a&gt;
&lt;a href="mailto:info@mediawole.com"&gt;mailto:info@mediawole.com&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/158104178192097877-3085311436171550163?l=blog.mediawhole.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DirtyWords?a=j9L4hjJW9J8:Mr_j2WiI0cA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DirtyWords?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DirtyWords?a=j9L4hjJW9J8:Mr_j2WiI0cA:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DirtyWords?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DirtyWords/~4/j9L4hjJW9J8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.mediawhole.com/feeds/3085311436171550163/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.mediawhole.com/2011/01/centralising-global-tfs.html#comment-form" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/158104178192097877/posts/default/3085311436171550163?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/158104178192097877/posts/default/3085311436171550163?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DirtyWords/~3/j9L4hjJW9J8/centralising-global-tfs.html" title="Centralising global TFS alerts/notifications" /><author><name>Michael Hanes</name><uri>http://www.blogger.com/profile/01877569030107816208</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/-a7o_YpicYcQ/TqirMmZt3HI/AAAAAAAADiM/N8xoftyG-0k/s220/Michael%2BHanes%2BCropped%2B2.jpg" /></author><thr:total>5</thr:total><feedburner:origLink>http://blog.mediawhole.com/2011/01/centralising-global-tfs.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUMNR3s8eCp7ImA9Wx9XF0Q.&quot;"><id>tag:blogger.com,1999:blog-158104178192097877.post-4626725232109353980</id><published>2011-01-12T08:51:00.001+08:00</published><updated>2011-01-12T08:51:36.570+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-01-12T08:51:36.570+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Administration" /><category scheme="http://www.blogger.com/atom/ns#" term="Things to Remember" /><category scheme="http://www.blogger.com/atom/ns#" term="Security" /><category scheme="http://www.blogger.com/atom/ns#" term="TFS" /><category scheme="http://www.blogger.com/atom/ns#" term="Visual Studio" /><category scheme="http://www.blogger.com/atom/ns#" term="Best Practice" /><category scheme="http://www.blogger.com/atom/ns#" term="How-To" /><title>How to change the service accounts used by TFS 2010</title><content type="html">&lt;p&gt;As with many Microsoft products running with specific service accounts, TFS offers an easy way to change the service account it uses or update the account password. &lt;/p&gt;  &lt;p&gt;You can do this manually by mucking with application pool identities and database permissions but there's a much easier way using the TFS Administration Console.&lt;/p&gt;  &lt;p&gt;Assuming you have the right permissions, fire up the console and click into the Application Tier node; in the Application Tier Summary you'll find two links: Change Account and Reapply Account. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_kuHIq0i1UO4/TSz7FOUnMjI/AAAAAAAADdc/2bOC4btKIVs/s1600-h/tfs_change_account%5B3%5D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="tfs_change_account" border="0" alt="tfs_change_account" src="http://lh6.ggpht.com/_kuHIq0i1UO4/TSz7F7Wa_HI/AAAAAAAADdg/uMzzSVan2Qs/tfs_change_account_thumb%5B1%5D.png?imgmax=800" width="389" height="241" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Change Account allows you to change the service account used by the system while Reapply Account allows you to change the password for the currently configured account. You can easily switch from Network Service to a local or domain account (or vice versa) but be sure to grant any local/domain account the Log on as service permission.&lt;/p&gt; &lt;center&gt;If you found this post helpful, please support my advertisers. &lt;/center&gt;&lt;center&gt;   &lt;table&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td&gt;&lt;script type="text/javascript" src="http://sharepointads.com/members/scripts/banner.php?a_aid=NA&amp;amp;a_bid=cde7edc2"&gt;&lt;/script&gt;&lt;/td&gt;          &lt;td&gt;&lt;script type="text/javascript" src="http://sharepointads.com/members/scripts/banner.php?a_aid=NA&amp;amp;a_bid=48840e1d"&gt;&lt;/script&gt;&lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/center&gt;  &lt;div class="blogger-post-footer"&gt;Dirty Words (Michael Hanes) - &lt;a href="http://blog.mediawhole.com"&gt;blog.mediawhole.com&lt;/a&gt;
&lt;a href="mailto:info@mediawole.com"&gt;mailto:info@mediawole.com&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/158104178192097877-4626725232109353980?l=blog.mediawhole.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DirtyWords?a=0fj2By3kq-M:9yubEqqrpRg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DirtyWords?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DirtyWords?a=0fj2By3kq-M:9yubEqqrpRg:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DirtyWords?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DirtyWords/~4/0fj2By3kq-M" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.mediawhole.com/feeds/4626725232109353980/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.mediawhole.com/2011/01/how-to-change-service-accounts-used-by.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/158104178192097877/posts/default/4626725232109353980?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/158104178192097877/posts/default/4626725232109353980?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DirtyWords/~3/0fj2By3kq-M/how-to-change-service-accounts-used-by.html" title="How to change the service accounts used by TFS 2010" /><author><name>Michael Hanes</name><uri>http://www.blogger.com/profile/01877569030107816208</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/-a7o_YpicYcQ/TqirMmZt3HI/AAAAAAAADiM/N8xoftyG-0k/s220/Michael%2BHanes%2BCropped%2B2.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/_kuHIq0i1UO4/TSz7F7Wa_HI/AAAAAAAADdg/uMzzSVan2Qs/s72-c/tfs_change_account_thumb%5B1%5D.png?imgmax=800" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://blog.mediawhole.com/2011/01/how-to-change-service-accounts-used-by.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUUMQX47fSp7ImA9Wx9XF08.&quot;"><id>tag:blogger.com,1999:blog-158104178192097877.post-8296616767828183649</id><published>2011-01-11T14:26:00.001+08:00</published><updated>2011-01-11T14:28:00.005+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-01-11T14:28:00.005+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Administration" /><category scheme="http://www.blogger.com/atom/ns#" term=".NET" /><category scheme="http://www.blogger.com/atom/ns#" term="ASP.NET" /><category scheme="http://www.blogger.com/atom/ns#" term="Debugging" /><category scheme="http://www.blogger.com/atom/ns#" term="Visual Studio" /><category scheme="http://www.blogger.com/atom/ns#" term="How-To" /><title>How to run the Visual Studio Remote Debugger as a Service</title><content type="html">&lt;p&gt;I've previously &lt;a href="http://blog.mediawhole.com/2010/07/visual-studio-2010-remote-debugger.html"&gt;outlined a fairly clunky approach&lt;/a&gt; to getting the VS remote debugger installed and configured to start automatically (e.g. in a dev environment); since writing that post, I've since unearthed the remote debugger wizard and the joys (and ease) of &lt;a href="http://msdn.microsoft.com/en-us/library/xf8k2h6a.aspx"&gt;running it as a service&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;Firstly, the remote debug wizard is &lt;a href="http://social.msdn.microsoft.com/Forums/en-US/vsdebug/thread/a6c446df-fa41-48cc-b8cd-adc5a69cac93"&gt;not shipped&lt;/a&gt; with VS2010 so you'll need to &lt;a href="http://www.microsoft.com/downloads/en/details.aspx?FamilyID=60ec9d08-439b-4986-ae43-0487eb83c09e&amp;amp;displaylang=en"&gt;download&lt;/a&gt; the rdbgsetup file appropriate for your environment. Run the installer and you'll be prompted to configure the remote debugger once installation completes.&lt;/p&gt;  &lt;p&gt;The wizard will present you with the option to Run the &amp;quot;Visual Studio 2010 Remote Debugger&amp;quot; service; check the box and supply an account with Log on as a service rights (the wizard will complain if the account isn't configured correctly). &lt;/p&gt;  &lt;p&gt;To grant Log on as a service rights, do this in Windows Server 2008:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Administrative Tools –&amp;gt; Local Security Policy; &lt;/li&gt;    &lt;li&gt;Security Settings\Local Policies\User Rights Assignment; &lt;/li&gt;    &lt;li&gt;Open Log on a service and add the user you want to configure. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;The wizard will also configure the firewall on the machine to be debugged so you'll need to tell it what kind of users you want to allow in.&lt;/p&gt;  &lt;p&gt;Once complete, you'll find the Visual Studio 10 Remote Debugger service listed in the Services applet and configured to start automatically. It runs as msvmon100 in the Services tab of Windows Task Manager.&lt;/p&gt;  &lt;p&gt;Finally, launch visual studio and connect to the target server (Tools –&amp;gt; Attach to Process or CTRL+ALT+P and enter the name of your server in the Qualifier box.&lt;/p&gt; &lt;center&gt;If you found this post helpful, please support my advertisers. &lt;/center&gt;&lt;center&gt;   &lt;table&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td&gt;&lt;script type="text/javascript" src="http://sharepointads.com/members/scripts/banner.php?a_aid=NA&amp;amp;a_bid=cde7edc2"&gt;&lt;/script&gt;&lt;/td&gt;          &lt;td&gt;&lt;script type="text/javascript" src="http://sharepointads.com/members/scripts/banner.php?a_aid=NA&amp;amp;a_bid=48840e1d"&gt;&lt;/script&gt;&lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/center&gt;  &lt;div class="blogger-post-footer"&gt;Dirty Words (Michael Hanes) - &lt;a href="http://blog.mediawhole.com"&gt;blog.mediawhole.com&lt;/a&gt;
&lt;a href="mailto:info@mediawole.com"&gt;mailto:info@mediawole.com&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/158104178192097877-8296616767828183649?l=blog.mediawhole.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DirtyWords?a=d4uPGVq8oNU:Wr5UBnk6hio:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DirtyWords?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DirtyWords?a=d4uPGVq8oNU:Wr5UBnk6hio:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DirtyWords?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DirtyWords/~4/d4uPGVq8oNU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.mediawhole.com/feeds/8296616767828183649/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.mediawhole.com/2011/01/how-to-run-visual-studio-remote.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/158104178192097877/posts/default/8296616767828183649?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/158104178192097877/posts/default/8296616767828183649?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DirtyWords/~3/d4uPGVq8oNU/how-to-run-visual-studio-remote.html" title="How to run the Visual Studio Remote Debugger as a Service" /><author><name>Michael Hanes</name><uri>http://www.blogger.com/profile/01877569030107816208</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/-a7o_YpicYcQ/TqirMmZt3HI/AAAAAAAADiM/N8xoftyG-0k/s220/Michael%2BHanes%2BCropped%2B2.jpg" /></author><thr:total>2</thr:total><feedburner:origLink>http://blog.mediawhole.com/2011/01/how-to-run-visual-studio-remote.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkECQXg_eCp7ImA9Wx9RGEQ.&quot;"><id>tag:blogger.com,1999:blog-158104178192097877.post-5952879354311767589</id><published>2010-12-21T09:24:00.001+08:00</published><updated>2010-12-21T09:24:20.640+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-21T09:24:20.640+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Search" /><category scheme="http://www.blogger.com/atom/ns#" term="Administration" /><category scheme="http://www.blogger.com/atom/ns#" term="Tools" /><category scheme="http://www.blogger.com/atom/ns#" term="64-bit" /><category scheme="http://www.blogger.com/atom/ns#" term="Windows" /><title>grepWin–A lightweight replacement for Windows Search</title><content type="html">&lt;p&gt;I don't know if Windows Search on my Windows Server 2008 R2 machine is crippled because it's a server machine (I'm all &lt;a href="http://www.win2008workstation.com/win2008/enable-windows-search-service"&gt;set up&lt;/a&gt; to run Search) but I invariably have trouble finding strings I know exist in files. In other words, search in files or search in content doesn't seem to work despite my configuration, rebuilding the search index, and pulling my hair out.&lt;/p&gt;  &lt;p&gt;Having yet another service running that indexes the majority of the non-system files on my computer also doesn't really appeal and for that reason (among others) I've also decided I don't want to add more search indexing with the likes of &lt;a href="http://desktop.google.com/"&gt;Google Desktop&lt;/a&gt; Search. &lt;/p&gt;  &lt;p&gt;In fact, what I want is a lightweight search application that I can occasionally use with regular expressions. It should be fast and convenient to use, preferably without a command line. I want to be able to specify a start directory and optionally have it search subdirectories and file contents.&lt;/p&gt;  &lt;p&gt;And here is a tool that meets all of the above criteria: &lt;a href="http://tools.tortoisesvn.net/grepWin.html"&gt;http://tools.tortoisesvn.net/grepWin.html&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;(FWIW, this is not an infomercial—I haven no affiliation with Stefan or grepWin and am not paid to write this)&lt;/p&gt;  &lt;p&gt;grepWin is 64-bit compatible and Stephan offers an installable version that offers Explorer context menu integration or a portable version that doesn't need to be installed. &lt;/p&gt;  &lt;p&gt;There's no indexing involved so you'll likely want to narrow the start location of your search as much as possible but it's still fast. &lt;/p&gt;  &lt;p&gt;Your search can be case sensitive or not and you can limit file sizes. A search can also exclude directories. &lt;/p&gt;  &lt;p&gt;The results pane lists file details (size, path, date, etc) and also offers a content view so you can preview the match. &lt;/p&gt;  &lt;p&gt;Search settings are automatically persisted so using the tool is incredibly convenient.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://tools.tortoisesvn.net/grepWin.html"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="grepWin" border="0" alt="grepWin" src="http://lh4.ggpht.com/_kuHIq0i1UO4/TRABwpTNH_I/AAAAAAAADdE/B0YQdfb_-C8/grepWin%5B4%5D.png?imgmax=800" width="399" height="327" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;center&gt;If you found this post helpful, please support my advertisers. &lt;/center&gt;&lt;center&gt;   &lt;table&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td&gt;&lt;script type="text/javascript" src="http://sharepointads.com/members/scripts/banner.php?a_aid=NA&amp;amp;a_bid=cde7edc2"&gt;&lt;/script&gt;&lt;/td&gt;          &lt;td&gt;&lt;script type="text/javascript" src="http://sharepointads.com/members/scripts/banner.php?a_aid=NA&amp;amp;a_bid=48840e1d"&gt;&lt;/script&gt;&lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/center&gt;  &lt;div class="blogger-post-footer"&gt;Dirty Words (Michael Hanes) - &lt;a href="http://blog.mediawhole.com"&gt;blog.mediawhole.com&lt;/a&gt;
&lt;a href="mailto:info@mediawole.com"&gt;mailto:info@mediawole.com&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/158104178192097877-5952879354311767589?l=blog.mediawhole.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DirtyWords?a=ohG4dluLtmg:NjkID-jcsmE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DirtyWords?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DirtyWords?a=ohG4dluLtmg:NjkID-jcsmE:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DirtyWords?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DirtyWords/~4/ohG4dluLtmg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.mediawhole.com/feeds/5952879354311767589/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.mediawhole.com/2010/12/grepwina-lightweight-replacement-for.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/158104178192097877/posts/default/5952879354311767589?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/158104178192097877/posts/default/5952879354311767589?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DirtyWords/~3/ohG4dluLtmg/grepwina-lightweight-replacement-for.html" title="grepWin–A lightweight replacement for Windows Search" /><author><name>Michael Hanes</name><uri>http://www.blogger.com/profile/01877569030107816208</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/-a7o_YpicYcQ/TqirMmZt3HI/AAAAAAAADiM/N8xoftyG-0k/s220/Michael%2BHanes%2BCropped%2B2.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/_kuHIq0i1UO4/TRABwpTNH_I/AAAAAAAADdE/B0YQdfb_-C8/s72-c/grepWin%5B4%5D.png?imgmax=800" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://blog.mediawhole.com/2010/12/grepwina-lightweight-replacement-for.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkIASX0zfyp7ImA9Wx9RFE0.&quot;"><id>tag:blogger.com,1999:blog-158104178192097877.post-2112683921007465815</id><published>2010-12-15T17:13:00.001+08:00</published><updated>2010-12-15T17:15:48.387+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-15T17:15:48.387+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Web Content Management" /><category scheme="http://www.blogger.com/atom/ns#" term="Things to Remember" /><category scheme="http://www.blogger.com/atom/ns#" term="Branding" /><category scheme="http://www.blogger.com/atom/ns#" term="SharePoint" /><category scheme="http://www.blogger.com/atom/ns#" term="Web Parts" /><title>How to disable web part chrome</title><content type="html">&lt;p&gt;In the context of a highly-branded WCM site, the default &amp;quot;chrome&amp;quot; (border and title) SharePoint wraps around your custom web parts can be ugly and inconvenient. At worst, it will make your site look SharePoint-y and require every web part added to a page to have its Chrome settings manually adjusted. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_kuHIq0i1UO4/TQiHQP1-2ZI/AAAAAAAADc8/8uOONwXasj0/s1600-h/Chrome%20Type%5B4%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="Chrome Type" border="0" alt="Chrome Type" src="http://lh6.ggpht.com/_kuHIq0i1UO4/TQiHQ02WZKI/AAAAAAAADdA/5hc6t2Y_UxU/Chrome%20Type_thumb%5B2%5D.png?imgmax=800" width="223" height="147" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;That's no way for a web part to behave in content management system but what to do?&lt;/p&gt;  &lt;p&gt;In the past I've set the chrome type explicitly for each custom web part, either in the .webpart/.dwp file itself or programmatically:&lt;/p&gt;  &lt;p&gt;&amp;lt;property name=&amp;quot;ChromeType&amp;quot; type=&amp;quot;chrometype&amp;quot;&amp;gt;None&amp;lt;/property&amp;gt;&lt;/p&gt;  &lt;p&gt;this.ChromeType = PartChromeType.None;&lt;/p&gt;  &lt;p&gt;To avoid doing this per web part (or cluttering up your nice little base web part class), you can set the &lt;a href="http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.webparts.webzone.partchrometype.aspx"&gt;PartChromeType property&lt;/a&gt; on the WebPartZone declared in your page layout:&lt;/p&gt;  &lt;p&gt;&amp;lt;WebPartPages:WebPartZone id=&amp;quot;wpzLeftColumn&amp;quot; runat=&amp;quot;server&amp;quot; title=&amp;quot;Left Column&amp;quot; &lt;strong&gt;PartChromeType=&amp;quot;None&amp;quot;&lt;/strong&gt;&amp;gt;&lt;/p&gt;  &lt;p&gt;Any web parts added to that zone with a default Chrome Type (aptly named &amp;quot;Default&amp;quot;) will inherit this setting from the web part zone. Of course individual web parts can override this as required.&lt;/p&gt; &lt;center&gt;If you found this post helpful, please support my advertisers. &lt;/center&gt;&lt;center&gt;   &lt;table&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td&gt;&lt;script type="text/javascript" src="http://sharepointads.com/members/scripts/banner.php?a_aid=NA&amp;amp;a_bid=cde7edc2"&gt;&lt;/script&gt;&lt;/td&gt;          &lt;td&gt;&lt;script type="text/javascript" src="http://sharepointads.com/members/scripts/banner.php?a_aid=NA&amp;amp;a_bid=48840e1d"&gt;&lt;/script&gt;&lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/center&gt;  &lt;div class="blogger-post-footer"&gt;Dirty Words (Michael Hanes) - &lt;a href="http://blog.mediawhole.com"&gt;blog.mediawhole.com&lt;/a&gt;
&lt;a href="mailto:info@mediawole.com"&gt;mailto:info@mediawole.com&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/158104178192097877-2112683921007465815?l=blog.mediawhole.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DirtyWords?a=cagOuX9R5Zc:kw5tFI1J40s:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DirtyWords?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DirtyWords?a=cagOuX9R5Zc:kw5tFI1J40s:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DirtyWords?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DirtyWords/~4/cagOuX9R5Zc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.mediawhole.com/feeds/2112683921007465815/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.mediawhole.com/2010/12/how-to-disable-web-part-chrome.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/158104178192097877/posts/default/2112683921007465815?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/158104178192097877/posts/default/2112683921007465815?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DirtyWords/~3/cagOuX9R5Zc/how-to-disable-web-part-chrome.html" title="How to disable web part chrome" /><author><name>Michael Hanes</name><uri>http://www.blogger.com/profile/01877569030107816208</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/-a7o_YpicYcQ/TqirMmZt3HI/AAAAAAAADiM/N8xoftyG-0k/s220/Michael%2BHanes%2BCropped%2B2.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/_kuHIq0i1UO4/TQiHQ02WZKI/AAAAAAAADdA/5hc6t2Y_UxU/s72-c/Chrome%20Type_thumb%5B2%5D.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.mediawhole.com/2010/12/how-to-disable-web-part-chrome.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUENQn4zfCp7ImA9Wx9RE0U.&quot;"><id>tag:blogger.com,1999:blog-158104178192097877.post-3459599523816314355</id><published>2010-12-15T12:34:00.001+08:00</published><updated>2010-12-15T12:34:53.084+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-15T12:34:53.084+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term=".NET" /><category scheme="http://www.blogger.com/atom/ns#" term="SharePoint" /><category scheme="http://www.blogger.com/atom/ns#" term="Debugging" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><category scheme="http://www.blogger.com/atom/ns#" term="Web Parts" /><title>Enumeration-based property with initialiser fails to load in tool pane</title><content type="html">&lt;p&gt;I encountered what is likely an obscure issue today while using an existing enumeration to populate a drop down list in the tool pane of a SharePoint web part.&lt;/p&gt;  &lt;p&gt;The web part didn't require a custom &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.webpartpages.toolpart.aspx"&gt;toolpart&lt;/a&gt; so I'm referring to a web part property defined within the web part class itself:&lt;/p&gt;  &lt;p&gt;[SPWebCategoryName (&amp;quot;TWA&amp;quot;)]    &lt;br /&gt;[FriendlyNameAttribute (&amp;quot;Region Override&amp;quot;)]     &lt;br /&gt;[WebDescription (&amp;quot;Explicitly configure the region displayed when the mode is set to Region.&amp;quot;)]     &lt;br /&gt;[Personalizable (PersonalizationScope.Shared, false)]     &lt;br /&gt;[WebBrowsable (true)]     &lt;br /&gt;&lt;strong&gt;public WARegions RegionOverride { get; set; }&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Notice how the public RegionOverride property has a type of WARegions. Normally, the end result is an additional custom property displayed in the web part tool pane; in this case, the WARegions type is an &lt;a href="http://msdn.microsoft.com/en-us/library/cc138362.aspx"&gt;enumeration&lt;/a&gt; and SharePoint therefore renders this as a drop down list:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_kuHIq0i1UO4/TQhFaGB1SeI/AAAAAAAADc0/39W5sFLwGKQ/s1600-h/Enumeration%20DDL%5B2%5D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="Enumeration DDL" border="0" alt="Enumeration DDL" src="http://lh4.ggpht.com/_kuHIq0i1UO4/TQhFa4SAISI/AAAAAAAADc4/ZQUN8vc6aRI/Enumeration%20DDL_thumb.png?imgmax=800" width="160" height="140" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;I say normally because today I was only getting a disabled DDL containing a single item (&amp;quot;Perth&amp;quot;). SharePoint was also kind enough to present me with this vaguely useful error message: &lt;/p&gt;  &lt;p&gt;&lt;em&gt;Some of the properties for this Web Part cannot be displayed properly. For more information, see your site administrator.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;The WARegions enumeration is an existing enum I chose to reuse for the sake of convenience. Upon further inspection, I noticed the first element in the enum (Perth) was explicitly assigned a value of &lt;em&gt;1&lt;/em&gt;. Acting on my suspicion, I removed the explicit assignment and the DDL would then display as expected. &lt;/p&gt;  &lt;p&gt;As a final test to confirm whether the explicit initialisation was somehow behind the single list item being displayed, I set default values for all elements in the enum but the error returned. Fortunately in my case I can do away with the explicit initialisation (which I'm not keen on—I prefer to initialise enums myself).&lt;/p&gt; &lt;center&gt;If you found this post helpful, please support my advertisers. &lt;/center&gt;&lt;center&gt;   &lt;table&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td&gt;&lt;script type="text/javascript" src="http://sharepointads.com/members/scripts/banner.php?a_aid=NA&amp;amp;a_bid=cde7edc2"&gt;&lt;/script&gt;&lt;/td&gt;          &lt;td&gt;&lt;script type="text/javascript" src="http://sharepointads.com/members/scripts/banner.php?a_aid=NA&amp;amp;a_bid=48840e1d"&gt;&lt;/script&gt;&lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/center&gt;  &lt;div class="blogger-post-footer"&gt;Dirty Words (Michael Hanes) - &lt;a href="http://blog.mediawhole.com"&gt;blog.mediawhole.com&lt;/a&gt;
&lt;a href="mailto:info@mediawole.com"&gt;mailto:info@mediawole.com&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/158104178192097877-3459599523816314355?l=blog.mediawhole.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DirtyWords?a=iIpchA-zmxQ:1j-jpSNfBAc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DirtyWords?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DirtyWords?a=iIpchA-zmxQ:1j-jpSNfBAc:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DirtyWords?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DirtyWords/~4/iIpchA-zmxQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.mediawhole.com/feeds/3459599523816314355/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.mediawhole.com/2010/12/enumeration-based-property-with.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/158104178192097877/posts/default/3459599523816314355?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/158104178192097877/posts/default/3459599523816314355?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DirtyWords/~3/iIpchA-zmxQ/enumeration-based-property-with.html" title="Enumeration-based property with initialiser fails to load in tool pane" /><author><name>Michael Hanes</name><uri>http://www.blogger.com/profile/01877569030107816208</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/-a7o_YpicYcQ/TqirMmZt3HI/AAAAAAAADiM/N8xoftyG-0k/s220/Michael%2BHanes%2BCropped%2B2.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/_kuHIq0i1UO4/TQhFa4SAISI/AAAAAAAADc4/ZQUN8vc6aRI/s72-c/Enumeration%20DDL_thumb.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.mediawhole.com/2010/12/enumeration-based-property-with.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0MARng6eip7ImA9Wx9REkw.&quot;"><id>tag:blogger.com,1999:blog-158104178192097877.post-4734827535815882853</id><published>2010-12-13T12:44:00.001+08:00</published><updated>2010-12-13T12:44:07.612+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-13T12:44:07.612+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Software Development" /><category scheme="http://www.blogger.com/atom/ns#" term="Visual Studio" /><title>My custom Visual Studio keyboard shortcuts</title><content type="html">&lt;p&gt;I do all of the builds in my position as Development Coordinator but with the Visual Studio project &lt;a href="https://connect.microsoft.com/VisualStudio/feedback/details/580934/declutter-project-context-menu"&gt;context menus out of control&lt;/a&gt; and nearly unusable with clutter from various plugins (including &lt;a href="http://www.jetbrains.com/resharper/"&gt;ReSharper&lt;/a&gt;, &lt;a href="http://visualstudiogallery.msdn.microsoft.com/en-us/e5f41ad9-4edc-4912-bca3-91147db95b99"&gt;PowerCommands&lt;/a&gt;, and &lt;a href="http://visualstudiogallery.msdn.microsoft.com/en-us/d0d33361-18e2-46c0-8ff2-4adea1e34fef"&gt;Productivity Power Tools&lt;/a&gt;), I've finally cracked. &lt;/p&gt;  &lt;p&gt;Since we don't (yet) have a build server, a normal manual build workflow goes something like &amp;quot;do stuff, do more stuff, BUILD, do stuff, OPEN DEPLOYMENT FOLDER IN EXPLORER, copy files to drop folder, etc. Before installing ReSharper, the VS team finally had all context menu items displaying on a single screen, with no scrolling required; ReSharper has ruined all of that again and I now find myself forever scrolling the context menu from the top (Rebuild) to the bottom (Open Folder in Windows Explorer). &lt;/p&gt;  &lt;p&gt;Because I'm forever installing Visual Studio in different environments/upgrading/etc, I'm loathe to define custom keyboard mappings (likely a hangover from my days of using the product before Import and Export Settings… was introduced). Nonetheless, these are the shortcuts I've finally created:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Project.OpenFolderinWindowsExplorer – Alt+ O&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Build.RebuildSolution – Alt+ R&lt;/strong&gt; (Why &lt;a href="http://petesbloggerama.blogspot.com/2007/12/visual-studio-difference-between-build.html"&gt;rebuild instead of build&lt;/a&gt;? Personal preference)&lt;/p&gt; &lt;center&gt;If you found this post helpful, please support my advertisers. &lt;/center&gt;&lt;center&gt;   &lt;table&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td&gt;&lt;script type="text/javascript" src="http://sharepointads.com/members/scripts/banner.php?a_aid=NA&amp;amp;a_bid=cde7edc2"&gt;&lt;/script&gt;&lt;/td&gt;          &lt;td&gt;&lt;script type="text/javascript" src="http://sharepointads.com/members/scripts/banner.php?a_aid=NA&amp;amp;a_bid=48840e1d"&gt;&lt;/script&gt;&lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/center&gt;  &lt;div class="blogger-post-footer"&gt;Dirty Words (Michael Hanes) - &lt;a href="http://blog.mediawhole.com"&gt;blog.mediawhole.com&lt;/a&gt;
&lt;a href="mailto:info@mediawole.com"&gt;mailto:info@mediawole.com&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/158104178192097877-4734827535815882853?l=blog.mediawhole.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DirtyWords?a=peWA71VBN58:3rbNEriMPSg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DirtyWords?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DirtyWords?a=peWA71VBN58:3rbNEriMPSg:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DirtyWords?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DirtyWords/~4/peWA71VBN58" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.mediawhole.com/feeds/4734827535815882853/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.mediawhole.com/2010/12/my-custom-visual-studio-keyboard.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/158104178192097877/posts/default/4734827535815882853?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/158104178192097877/posts/default/4734827535815882853?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DirtyWords/~3/peWA71VBN58/my-custom-visual-studio-keyboard.html" title="My custom Visual Studio keyboard shortcuts" /><author><name>Michael Hanes</name><uri>http://www.blogger.com/profile/01877569030107816208</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/-a7o_YpicYcQ/TqirMmZt3HI/AAAAAAAADiM/N8xoftyG-0k/s220/Michael%2BHanes%2BCropped%2B2.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://blog.mediawhole.com/2010/12/my-custom-visual-studio-keyboard.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0UFRn06eSp7ImA9Wx9SE0k.&quot;"><id>tag:blogger.com,1999:blog-158104178192097877.post-9082375044886811295</id><published>2010-12-03T12:02:00.001+08:00</published><updated>2010-12-03T12:06:57.311+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-03T12:06:57.311+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Web Content Management" /><category scheme="http://www.blogger.com/atom/ns#" term="Things to Remember" /><category scheme="http://www.blogger.com/atom/ns#" term="SharePoint" /><category scheme="http://www.blogger.com/atom/ns#" term="Reusable Content" /><category scheme="http://www.blogger.com/atom/ns#" term="Regular Expressions" /><category scheme="http://www.blogger.com/atom/ns#" term="Debugging" /><category scheme="http://www.blogger.com/atom/ns#" term="HTML" /><title>Relative URLs, the Rich Text Editor, and Reusable Content</title><content type="html">&lt;p&gt;We recently started leveraging the &lt;a href="http://office.microsoft.com/en-us/sharepoint-server-help/use-reusable-content-HA010163838.aspx"&gt;Reusable Content&lt;/a&gt; list to supply user-editable content to one of our interactive online forms and outbound emails. This allows the content owner to tweak the content as required as this content isn't locked away in custom code or resource files—no build and deploy required and the content management system is even used as such (whatdya know?!).&lt;/p&gt;  &lt;p&gt;The Reusable Content list is provisioned by SharePoint when the Publishing feature is enabled; it allows users to define content snippets that can be maintained in a single location and updated automatically wherever they're used. You can optionally treat a reusable content snippet as a template—an editable copy is inserted into the page instead of a read-only, auto-updating view. &lt;/p&gt;  &lt;p&gt;Reusable Content list items are pretty straightforward and, most importantly, contain a single HTML (rich text) field. SharePoint naturally displays its rich text editor around this field in edit mode so the edit user experience is similar to editing page content.&lt;/p&gt;  &lt;p&gt;Unfortunately HTML fields in SharePoint are smarter than they should be and (in MOSS 2007), the product will mangle some content. I recently discovered it refuses to play with background-image style—they're silently removed whether they're inline or in an embedded stylesheet. (And yes, I know, inline styles are evil but this snippet was actually being plugged into an email so everything had to be self-contained).&lt;/p&gt;  &lt;p&gt;Despite the tricks SharePoint plays on you with &amp;quot;managed&amp;quot; URLs, it seems the rich text field also stores URLs pointing to content within the current site as relative URLs. Absolute URLs are converted automagically but you'll never really see this until you pull the content out via the API.&lt;/p&gt;  &lt;p&gt;We hunted for a way within SharePoint to convert all relative URLs in this content to absolute URLS but without much luck. I think there may be a Javascript function in one of the client scripts to do so for a chunk of content but there's nothing obvious in the server-side API. &lt;/p&gt;  &lt;p&gt;To address this, we replace all relative URLs using the regex below (note the URL group) (is using regex to parse HTML &lt;a href="http://www.codinghorror.com/blog/2009/11/parsing-html-the-cthulhu-way.html"&gt;bad&lt;/a&gt;? You be the judge). You may want to use &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.utilities.sputility.getfullurl.aspx"&gt;SPUtility.GetFullUrl()&lt;/a&gt; to convert individual URLs. &lt;/p&gt;  &lt;p&gt;@&amp;quot;(?:&amp;lt;\s*(?:a|img)\s+[^&amp;gt;]*(?:href|src)\s*=\s*[\&amp;quot;&amp;quot;'])(?!http)(?&amp;lt;url&amp;gt;[^\&amp;quot;&amp;quot;'&amp;gt;]+)[\&amp;quot;&amp;quot;'&amp;gt;]&amp;quot;&lt;/p&gt;  &lt;center&gt;If you found this post helpful, please support my advertisers.    &lt;table&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td&gt;&lt;script type="text/javascript" src="http://sharepointads.com/members/scripts/banner.php?a_aid=NA&amp;amp;a_bid=cde7edc2"&gt;&lt;/script&gt;&lt;/td&gt;          &lt;td&gt;&lt;script type="text/javascript" src="http://sharepointads.com/members/scripts/banner.php?a_aid=NA&amp;amp;a_bid=48840e1d"&gt;&lt;/script&gt;&lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/center&gt;  &lt;div class="blogger-post-footer"&gt;Dirty Words (Michael Hanes) - &lt;a href="http://blog.mediawhole.com"&gt;blog.mediawhole.com&lt;/a&gt;
&lt;a href="mailto:info@mediawole.com"&gt;mailto:info@mediawole.com&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/158104178192097877-9082375044886811295?l=blog.mediawhole.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DirtyWords?a=ORHjsKGaue8:ZueXdowTUdI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DirtyWords?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DirtyWords?a=ORHjsKGaue8:ZueXdowTUdI:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DirtyWords?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DirtyWords/~4/ORHjsKGaue8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.mediawhole.com/feeds/9082375044886811295/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.mediawhole.com/2010/12/relative-urls-rich-text-editor-and.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/158104178192097877/posts/default/9082375044886811295?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/158104178192097877/posts/default/9082375044886811295?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DirtyWords/~3/ORHjsKGaue8/relative-urls-rich-text-editor-and.html" title="Relative URLs, the Rich Text Editor, and Reusable Content" /><author><name>Michael Hanes</name><uri>http://www.blogger.com/profile/01877569030107816208</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/-a7o_YpicYcQ/TqirMmZt3HI/AAAAAAAADiM/N8xoftyG-0k/s220/Michael%2BHanes%2BCropped%2B2.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.mediawhole.com/2010/12/relative-urls-rich-text-editor-and.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk8GQ348fip7ImA9Wx9TEUg.&quot;"><id>tag:blogger.com,1999:blog-158104178192097877.post-1587777787319440561</id><published>2010-11-18T15:10:00.001+08:00</published><updated>2010-11-19T16:20:22.076+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-11-19T16:20:22.076+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Things to Remember" /><category scheme="http://www.blogger.com/atom/ns#" term="Software Development" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><title>DateTime format safe for file system</title><content type="html">&lt;p&gt;Couldn't find anything similar when I searched so thought I'd throw this out there for use in file names in a Windows file system:&lt;/p&gt;  &lt;p&gt;DateTime.Now.ToString (&amp;quot;yyyyMMddHHmmss&amp;quot;)&lt;/p&gt; &lt;p&gt;Will output &amp;quot;201001312359&amp;quot;&lt;/p&gt;  &lt;p&gt;Add a &amp;quot;.txt&amp;quot; or &amp;quot;.dat&amp;quot; if you're hard-core and you're all set.&lt;/p&gt; &lt;center&gt;If you found this post helpful, please support my advertisers.    &lt;table&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td&gt;&lt;script type="text/javascript" src="http://sharepointads.com/members/scripts/banner.php?a_aid=NA&amp;amp;a_bid=cde7edc2"&gt;&lt;/script&gt;&lt;/td&gt;          &lt;td&gt;&lt;script type="text/javascript" src="http://sharepointads.com/members/scripts/banner.php?a_aid=NA&amp;amp;a_bid=48840e1d"&gt;&lt;/script&gt;&lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/center&gt;  &lt;div class="blogger-post-footer"&gt;Dirty Words (Michael Hanes) - &lt;a href="http://blog.mediawhole.com"&gt;blog.mediawhole.com&lt;/a&gt;
&lt;a href="mailto:info@mediawole.com"&gt;mailto:info@mediawole.com&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/158104178192097877-1587777787319440561?l=blog.mediawhole.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DirtyWords?a=u5q8xx-ICrE:khtH2eOKgac:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DirtyWords?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DirtyWords?a=u5q8xx-ICrE:khtH2eOKgac:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DirtyWords?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DirtyWords/~4/u5q8xx-ICrE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.mediawhole.com/feeds/1587777787319440561/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.mediawhole.com/2010/11/datetime-format-safe-for-file-system.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/158104178192097877/posts/default/1587777787319440561?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/158104178192097877/posts/default/1587777787319440561?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DirtyWords/~3/u5q8xx-ICrE/datetime-format-safe-for-file-system.html" title="DateTime format safe for file system" /><author><name>Michael Hanes</name><uri>http://www.blogger.com/profile/01877569030107816208</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/-a7o_YpicYcQ/TqirMmZt3HI/AAAAAAAADiM/N8xoftyG-0k/s220/Michael%2BHanes%2BCropped%2B2.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.mediawhole.com/2010/11/datetime-format-safe-for-file-system.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUYHQ344cCp7ImA9Wx9TEUg.&quot;"><id>tag:blogger.com,1999:blog-158104178192097877.post-2928030554445713946</id><published>2010-11-17T17:05:00.001+08:00</published><updated>2010-11-19T15:52:12.038+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-11-19T15:52:12.038+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Web Content Management" /><category scheme="http://www.blogger.com/atom/ns#" term="List Programming" /><category scheme="http://www.blogger.com/atom/ns#" term="Software Development" /><category scheme="http://www.blogger.com/atom/ns#" term="SharePoint 2010" /><category scheme="http://www.blogger.com/atom/ns#" term="SharePoint" /><title>How to determine if a SPPublishingPage is published</title><content type="html">&lt;p&gt;You can programmatically determine if the &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.publishing.publishingpage.aspx"&gt;SPPublishingPage&lt;/a&gt; you're dealing with is in a published state by retrieving the &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spfilelevel.aspx"&gt;SPFileLevel&lt;/a&gt; of the page's corresponding SPFile:&lt;/p&gt;  &lt;p&gt;if (page.ListItem.File.Level == SPFileLevel.Published) …&lt;/p&gt;  &lt;p&gt;You can also access this through the &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.splistitem.level.aspx"&gt;PublishingPage.ListItem.Level&lt;/a&gt; property.&lt;/p&gt;  &lt;p&gt;The same SPFileLevel enumeration will also indicate if the page is in draft mode (checked in but not published) or checked out but in my experience this property will return SPFileLevel.Published or SPFileLevel.Draft more often than not. &lt;/p&gt;  &lt;p&gt;To determine whether the page is checked out, use the &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spfile.spcheckoutstatus(v=office.12).aspx"&gt;SPFile.CheckOutStatus&lt;/a&gt; property in WSS 3.0 or the&amp;#160; &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spfile.spcheckouttype.aspx"&gt;SPFile.CheckOutType&lt;/a&gt; property in SP2010. Any value other than None means the page is checked out. &lt;/p&gt; &lt;center&gt;If you found this post helpful, please support my advertisers. &lt;/center&gt;&lt;center&gt;   &lt;table&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td&gt;&lt;script type="text/javascript" src="http://sharepointads.com/members/scripts/banner.php?a_aid=NA&amp;amp;a_bid=cde7edc2"&gt;&lt;/script&gt;&lt;/td&gt;          &lt;td&gt;&lt;script type="text/javascript" src="http://sharepointads.com/members/scripts/banner.php?a_aid=NA&amp;amp;a_bid=48840e1d"&gt;&lt;/script&gt;&lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/center&gt;  &lt;div class="blogger-post-footer"&gt;Dirty Words (Michael Hanes) - &lt;a href="http://blog.mediawhole.com"&gt;blog.mediawhole.com&lt;/a&gt;
&lt;a href="mailto:info@mediawole.com"&gt;mailto:info@mediawole.com&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/158104178192097877-2928030554445713946?l=blog.mediawhole.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DirtyWords?a=OsERtDwW_eg:JYdylu0Cx-k:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DirtyWords?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DirtyWords?a=OsERtDwW_eg:JYdylu0Cx-k:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DirtyWords?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DirtyWords/~4/OsERtDwW_eg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.mediawhole.com/feeds/2928030554445713946/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.mediawhole.com/2010/11/how-to-determine-if-sppublishingpage-is.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/158104178192097877/posts/default/2928030554445713946?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/158104178192097877/posts/default/2928030554445713946?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DirtyWords/~3/OsERtDwW_eg/how-to-determine-if-sppublishingpage-is.html" title="How to determine if a SPPublishingPage is published" /><author><name>Michael Hanes</name><uri>http://www.blogger.com/profile/01877569030107816208</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/-a7o_YpicYcQ/TqirMmZt3HI/AAAAAAAADiM/N8xoftyG-0k/s220/Michael%2BHanes%2BCropped%2B2.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.mediawhole.com/2010/11/how-to-determine-if-sppublishingpage-is.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkIMQno_eCp7ImA9Wx5aGUU.&quot;"><id>tag:blogger.com,1999:blog-158104178192097877.post-3221893449774192156</id><published>2010-11-17T15:56:00.001+08:00</published><updated>2010-11-17T15:56:23.440+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-11-17T15:56:23.440+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Web Content Management" /><category scheme="http://www.blogger.com/atom/ns#" term="List Programming" /><category scheme="http://www.blogger.com/atom/ns#" term="Software Development" /><category scheme="http://www.blogger.com/atom/ns#" term="SharePoint" /><category scheme="http://www.blogger.com/atom/ns#" term="MOSS" /><title>SPSite.AllWebs vs SPWeb.Webs</title><content type="html">&lt;p&gt;There's a subtle distinction between &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spsite.allwebs.aspx"&gt;SPSite.AllWebs&lt;/a&gt; and &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spweb.webs.aspx"&gt;SPWeb.Webs&lt;/a&gt; to be aware of—and yes, despite this being the SharePoint API we're talking about, it's more than just a naming oddity! &lt;/p&gt;  &lt;p&gt;SPSite.AllWebs returns the immediate child webs of the site collection and all of their child webs (in other words, &lt;em&gt;all&lt;/em&gt; webs recursively within the site collection); SPWeb.Webs has a much narrower scope and only returns the first level child webs immediately below the SPWeb object.&lt;/p&gt;  &lt;p&gt;So what does this mean and how does it benefit you? If you're writing code that recursively walks the site hierarchy using SPWeb.Webs, you may be able to avoid the overhead by simply using SPSite.AllWebs. Recursion is fun and all but it adds complexity where it may not be warranted.&lt;/p&gt; &lt;center&gt;If you found this post helpful, please support my advertisers. &lt;/center&gt;&lt;center&gt;   &lt;table&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td&gt;&lt;script type="text/javascript" src="http://sharepointads.com/members/scripts/banner.php?a_aid=NA&amp;amp;a_bid=cde7edc2"&gt;&lt;/script&gt;&lt;/td&gt;          &lt;td&gt;&lt;script type="text/javascript" src="http://sharepointads.com/members/scripts/banner.php?a_aid=NA&amp;amp;a_bid=48840e1d"&gt;&lt;/script&gt;&lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/center&gt;  &lt;div class="blogger-post-footer"&gt;Dirty Words (Michael Hanes) - &lt;a href="http://blog.mediawhole.com"&gt;blog.mediawhole.com&lt;/a&gt;
&lt;a href="mailto:info@mediawole.com"&gt;mailto:info@mediawole.com&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/158104178192097877-3221893449774192156?l=blog.mediawhole.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DirtyWords?a=lsAcYIAB7Kc:bJZd0aYedDY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DirtyWords?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DirtyWords?a=lsAcYIAB7Kc:bJZd0aYedDY:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DirtyWords?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DirtyWords/~4/lsAcYIAB7Kc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.mediawhole.com/feeds/3221893449774192156/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.mediawhole.com/2010/11/spsiteallwebs-vs-spwebwebs.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/158104178192097877/posts/default/3221893449774192156?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/158104178192097877/posts/default/3221893449774192156?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DirtyWords/~3/lsAcYIAB7Kc/spsiteallwebs-vs-spwebwebs.html" title="SPSite.AllWebs vs SPWeb.Webs" /><author><name>Michael Hanes</name><uri>http://www.blogger.com/profile/01877569030107816208</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/-a7o_YpicYcQ/TqirMmZt3HI/AAAAAAAADiM/N8xoftyG-0k/s220/Michael%2BHanes%2BCropped%2B2.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.mediawhole.com/2010/11/spsiteallwebs-vs-spwebwebs.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DE4AQXw9eCp7ImA9Wx5bEkg.&quot;"><id>tag:blogger.com,1999:blog-158104178192097877.post-3265486511227217554</id><published>2010-10-28T17:09:00.000+08:00</published><updated>2010-10-28T17:09:00.260+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-10-28T17:09:00.260+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Things to Remember" /><category scheme="http://www.blogger.com/atom/ns#" term="Security" /><category scheme="http://www.blogger.com/atom/ns#" term="Windows" /><title>Free Antivirus for Windows Server 2008</title><content type="html">&lt;p&gt;I've been a long time home user of &lt;a href="http://www.avast.com/en-au/free-antivirus-download"&gt;Avast! antivirus&lt;/a&gt;. It's a great product that doesn't bog down my machine. Unfortunately the free home edition won't install on Windows Server 2008 R2 and I run a single-boot W2k8 environment because of my Hyper-V love affair. &lt;/p&gt;  &lt;p&gt;Don't get me wrong, I normally despise AV and security in any form… the guys I work with are probably fed up with me always shouting &amp;quot;security != productivity&amp;quot; when the bloody proxy policy has once again broken something or prevented me doing my job. But, every now and then, I feel incline to download evil things and God forbid those things include a virus of some kind—a quick scan would then come in handy…&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.clamwin.com/"&gt;ClamWin&lt;/a&gt; to the rescue! Don't know about the name but it doesn't include a real-time scanner which meets my requirements. So far so good… evil things downloaded and appear to be virus free!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;Dirty Words (Michael Hanes) - &lt;a href="http://blog.mediawhole.com"&gt;blog.mediawhole.com&lt;/a&gt;
&lt;a href="mailto:info@mediawole.com"&gt;mailto:info@mediawole.com&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/158104178192097877-3265486511227217554?l=blog.mediawhole.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DirtyWords?a=RXsDTmmv3e0:RBQaU-lqwtQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DirtyWords?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DirtyWords?a=RXsDTmmv3e0:RBQaU-lqwtQ:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DirtyWords?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DirtyWords/~4/RXsDTmmv3e0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.mediawhole.com/feeds/3265486511227217554/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.mediawhole.com/2010/10/free-antivirus-for-windows-server-2008.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/158104178192097877/posts/default/3265486511227217554?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/158104178192097877/posts/default/3265486511227217554?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DirtyWords/~3/RXsDTmmv3e0/free-antivirus-for-windows-server-2008.html" title="Free Antivirus for Windows Server 2008" /><author><name>Michael Hanes</name><uri>http://www.blogger.com/profile/01877569030107816208</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/-a7o_YpicYcQ/TqirMmZt3HI/AAAAAAAADiM/N8xoftyG-0k/s220/Michael%2BHanes%2BCropped%2B2.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://blog.mediawhole.com/2010/10/free-antivirus-for-windows-server-2008.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUEEQXc9fyp7ImA9Wx5bEUo.&quot;"><id>tag:blogger.com,1999:blog-158104178192097877.post-3830266897920758749</id><published>2010-10-27T18:00:00.000+08:00</published><updated>2010-10-27T18:00:00.967+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-10-27T18:00:00.967+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Things to Remember" /><category scheme="http://www.blogger.com/atom/ns#" term="IE" /><category scheme="http://www.blogger.com/atom/ns#" term="IIS" /><category scheme="http://www.blogger.com/atom/ns#" term="ASP.NET" /><category scheme="http://www.blogger.com/atom/ns#" term="Debugging" /><category scheme="http://www.blogger.com/atom/ns#" term="Browsers" /><category scheme="http://www.blogger.com/atom/ns#" term="Best Practice" /><category scheme="http://www.blogger.com/atom/ns#" term="HTML" /><title>Empty ImageUrl results in empty src and duplicate request</title><content type="html">&lt;p&gt;Not exactly a new issue but an empty &lt;a href="http://weblogs.asp.net/alessandro/archive/2007/09/30/image-element-with-an-empty-string-for-the-src-quot-quot-attribute-results-in-making-a-call-for-default-aspx.aspx"&gt;ASP.NET ImageUrl&lt;/a&gt; tripped us up today. In this case there were no visible symptoms but two requests were coming through when &lt;a href="http://www.fiddler2.com"&gt;Fiddlering&lt;/a&gt; the page view: the first initiated by the user and the second initiated by the page itself towards the end of the trace. In development with a debugger attached, this was manifest with Page_Load, CreateChildControls, etc being called twice for no obvious reason. &lt;/p&gt;  &lt;p&gt;Because I initially thought I introduced the problem with the control I was working on, I first attempted to convince ASP.NET CreateChildControls was complete; I did so by clearing the Controls collection before unleashing my own code and setting the ChildControlsCreated property true once done. Neither of these tricks had any affect and the Fiddler trace had me convinced something beyond the ASP.NET pipeline and IIS had to be at fault. &lt;/p&gt;  &lt;p&gt;That turned out to be the case but ASP.NET was still to blame ;-) &lt;/p&gt;  &lt;p&gt;Specifically, we were adding a server-side ASP.NET image control but not initialising its &lt;a href="http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.image.imageurl(v=VS.90).aspx"&gt;ImageUrl&lt;/a&gt; property; the image src was later being set by jQuery at runtime on the client side. As mentioned, there were no visible symptoms of the double request: the image src was set as expected by jQuery and everything appeared okay on the surface. The IE dev toolbar also showed image src as being correctly set and there were no 404s in the mix.&lt;/p&gt;  &lt;p&gt;It wasn't until we looked at the raw HTML that our ever-faithful admin extraordinaire noticed the empty &lt;strong&gt;src=&amp;quot;&amp;quot;&lt;/strong&gt; attribute. Removing the attribute removed the problem so I can only conclude IE is helpful enough to attempt to interpret a request for an empty image as a request for the parent directory of the current page while parsing the HTML before any Javascript runs. Thanks again, IE! &lt;/p&gt;  &lt;p&gt;Notably this problem wasn't reproducible in Firefox or Chrome. &lt;/p&gt;  &lt;p&gt;To fix the problem, we first set a default value for the ImageUrl property but that left me feeling dirty since it was still resulting in an unnecessary request. When I realised the server-side Image tag wasn't actually being used for anything server-side anyway, I replaced it with a boring old HTML img tag with no src. Microsoft has &lt;a href="https://connect.microsoft.com/VisualStudio/feedback/details/330201/asp-net-2-0-asp-image-and-empty-imageurl-causes-invalid-img-tag"&gt;other, equally lame workarounds&lt;/a&gt; for this if you're interested; note they also don't plan to fix this bug.&lt;/p&gt; &lt;center&gt;If you found this post helpful, please support my advertisers. &lt;/center&gt;&lt;center&gt;   &lt;table&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td&gt;&lt;script type="text/javascript" src="http://sharepointads.com/members/scripts/banner.php?a_aid=NA&amp;amp;a_bid=cde7edc2"&gt;&lt;/script&gt;&lt;/td&gt;          &lt;td&gt;&lt;script type="text/javascript" src="http://sharepointads.com/members/scripts/banner.php?a_aid=NA&amp;amp;a_bid=48840e1d"&gt;&lt;/script&gt;&lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/center&gt;  &lt;div class="blogger-post-footer"&gt;Dirty Words (Michael Hanes) - &lt;a href="http://blog.mediawhole.com"&gt;blog.mediawhole.com&lt;/a&gt;
&lt;a href="mailto:info@mediawole.com"&gt;mailto:info@mediawole.com&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/158104178192097877-3830266897920758749?l=blog.mediawhole.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DirtyWords?a=OoItIH8JwwY:bJHfLijw_WM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DirtyWords?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DirtyWords?a=OoItIH8JwwY:bJHfLijw_WM:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DirtyWords?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DirtyWords/~4/OoItIH8JwwY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.mediawhole.com/feeds/3830266897920758749/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.mediawhole.com/2010/10/empty-imageurl-results-in-empty-src-and.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/158104178192097877/posts/default/3830266897920758749?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/158104178192097877/posts/default/3830266897920758749?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DirtyWords/~3/OoItIH8JwwY/empty-imageurl-results-in-empty-src-and.html" title="Empty ImageUrl results in empty src and duplicate request" /><author><name>Michael Hanes</name><uri>http://www.blogger.com/profile/01877569030107816208</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/-a7o_YpicYcQ/TqirMmZt3HI/AAAAAAAADiM/N8xoftyG-0k/s220/Michael%2BHanes%2BCropped%2B2.jpg" /></author><thr:total>2</thr:total><feedburner:origLink>http://blog.mediawhole.com/2010/10/empty-imageurl-results-in-empty-src-and.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkIGQXg6cSp7ImA9Wx5UEU0.&quot;"><id>tag:blogger.com,1999:blog-158104178192097877.post-8555975595245239598</id><published>2010-10-15T10:08:00.001+08:00</published><updated>2010-10-15T10:08:40.619+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-10-15T10:08:40.619+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Things to Remember" /><category scheme="http://www.blogger.com/atom/ns#" term="Deployment" /><category scheme="http://www.blogger.com/atom/ns#" term="SharePoint" /><category scheme="http://www.blogger.com/atom/ns#" term="Debugging" /><title>Must-know SharePoint debugging tips</title><content type="html">&lt;p&gt;This post is a follow-on to my &lt;a href="http://blog.mediawhole.com/2009/04/must-know-visual-studio-debugging.html"&gt;Must-Know Visual Studio debugging tips&lt;/a&gt; article; I'm separating out my SharePoint debugging tips focused on list, feature, and solution deployment that don't relate to Visual Studio. &lt;/p&gt;  &lt;p&gt;Here you go:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Try activating your feature &lt;a href="http://blog.mediawhole.com/2010/04/stsadm-o-activatefeature-force.html"&gt;without the –force attribute&lt;/a&gt;; you'll likely need to deactivate the feature first &lt;/li&gt;    &lt;li&gt;Try uninstalling and reinstalling the feature &lt;/li&gt;    &lt;li&gt;If something stuck and rebooting seems to clear some kind of cache deep inside SharePoint, stop IIS and restart the various SharePoint Windows services &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;@echo off    &lt;br /&gt;@echo Stopping services...     &lt;br /&gt;iisreset /stop /noforce     &lt;br /&gt;net stop &amp;quot;Windows SharePoint Services Timer&amp;quot;     &lt;br /&gt;net stop &amp;quot;Windows SharePoint Services Administration&amp;quot;     &lt;br /&gt;net stop &amp;quot;Office SharePoint Server Search&amp;quot;     &lt;br /&gt;net stop &amp;quot;Windows SharePoint Services Search&amp;quot;     &lt;br /&gt;net stop &amp;quot;Windows SharePoint Services Tracing&amp;quot;     &lt;br /&gt;@echo Starting services...     &lt;br /&gt;net start &amp;quot;Windows SharePoint Services Tracing&amp;quot;     &lt;br /&gt;net start &amp;quot;Windows SharePoint Services Search&amp;quot;     &lt;br /&gt;net start &amp;quot;Office SharePoint Server Search&amp;quot;     &lt;br /&gt;net start &amp;quot;Windows SharePoint Services Administration&amp;quot;     &lt;br /&gt;net start &amp;quot;Windows SharePoint Services Timer&amp;quot;     &lt;br /&gt;iisreset /start     &lt;br /&gt;@pause&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Create a new list from your list definition (or at least, a new list item) &lt;/li&gt;    &lt;li&gt;Rebuild your solution and redeploy &lt;/li&gt; &lt;/ul&gt; &lt;center&gt;If you found this post helpful, please support my advertisers. &lt;/center&gt;&lt;center&gt;   &lt;table&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td&gt;&lt;script type="text/javascript" src="http://sharepointads.com/members/scripts/banner.php?a_aid=NA&amp;amp;a_bid=cde7edc2"&gt;&lt;/script&gt;&lt;/td&gt;          &lt;td&gt;&lt;script type="text/javascript" src="http://sharepointads.com/members/scripts/banner.php?a_aid=NA&amp;amp;a_bid=48840e1d"&gt;&lt;/script&gt;&lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/center&gt;  &lt;div class="blogger-post-footer"&gt;Dirty Words (Michael Hanes) - &lt;a href="http://blog.mediawhole.com"&gt;blog.mediawhole.com&lt;/a&gt;
&lt;a href="mailto:info@mediawole.com"&gt;mailto:info@mediawole.com&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/158104178192097877-8555975595245239598?l=blog.mediawhole.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DirtyWords?a=vKsgQ2BVbaw:sODSVnz1VVI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DirtyWords?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DirtyWords?a=vKsgQ2BVbaw:sODSVnz1VVI:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DirtyWords?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DirtyWords/~4/vKsgQ2BVbaw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.mediawhole.com/feeds/8555975595245239598/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.mediawhole.com/2010/10/must-know-sharepoint-debugging-tips.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/158104178192097877/posts/default/8555975595245239598?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/158104178192097877/posts/default/8555975595245239598?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DirtyWords/~3/vKsgQ2BVbaw/must-know-sharepoint-debugging-tips.html" title="Must-know SharePoint debugging tips" /><author><name>Michael Hanes</name><uri>http://www.blogger.com/profile/01877569030107816208</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/-a7o_YpicYcQ/TqirMmZt3HI/AAAAAAAADiM/N8xoftyG-0k/s220/Michael%2BHanes%2BCropped%2B2.jpg" /></author><thr:total>2</thr:total><feedburner:origLink>http://blog.mediawhole.com/2010/10/must-know-sharepoint-debugging-tips.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUACQXo4fip7ImA9Wx5UEEk.&quot;"><id>tag:blogger.com,1999:blog-158104178192097877.post-741658741483839398</id><published>2010-10-14T17:16:00.000+08:00</published><updated>2010-10-14T17:16:00.436+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-10-14T17:16:00.436+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="List Programming" /><category scheme="http://www.blogger.com/atom/ns#" term="SharePoint" /><category scheme="http://www.blogger.com/atom/ns#" term="MOSS" /><category scheme="http://www.blogger.com/atom/ns#" term="Documentation" /><title>The Mysterious SourceID Attribute</title><content type="html">&lt;p&gt;I see a lot field definitions around that unnecessarily include a &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spfield.sourceid(v=office.12).aspx"&gt;SourceID&lt;/a&gt; attribute:&lt;/p&gt;  &lt;p&gt;&amp;lt;Field    &lt;br /&gt;SourceID=&amp;quot;http://schemas.microsoft.com/sharepoint/v3&amp;quot;     &lt;br /&gt;…&lt;/p&gt;  &lt;p&gt;More often than not, the value of this attribute is set as above. Microsoft's own documentation samples tend to include this attribute.&lt;/p&gt;  &lt;p&gt;So what does it do? Not a lot as far as I can tell; I don't include it with my own field definitions because inspecting the field after deployment with &lt;a href="http://spm.codeplex.com/releases/view/22762"&gt;SharePoint Manager&lt;/a&gt; proves SharePoint sets it automatically with the GUID of the list that created the field. The &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spfield.sourceid(v=office.12).aspx"&gt;Field Element documentation&lt;/a&gt; also indicates it is optional.&lt;/p&gt;  &lt;p&gt;If you're intent on using it, the documentation describes this attribute as &amp;quot;containing the namespace that defines the field, such as http://schemas.microsoft.com/sharepoint/v3&amp;quot; so rather than use the default namespace it &lt;em&gt;may &lt;/em&gt;be advisable to use your own (I haven't tried this myself).&lt;/p&gt; &lt;center&gt;If you found this post helpful, please support my advertisers. &lt;/center&gt;&lt;center&gt;   &lt;table&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td&gt;&lt;script type="text/javascript" src="http://sharepointads.com/members/scripts/banner.php?a_aid=NA&amp;amp;a_bid=cde7edc2"&gt;&lt;/script&gt;&lt;/td&gt;          &lt;td&gt;&lt;script type="text/javascript" src="http://sharepointads.com/members/scripts/banner.php?a_aid=NA&amp;amp;a_bid=48840e1d"&gt;&lt;/script&gt;&lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/center&gt;  &lt;div class="blogger-post-footer"&gt;Dirty Words (Michael Hanes) - &lt;a href="http://blog.mediawhole.com"&gt;blog.mediawhole.com&lt;/a&gt;
&lt;a href="mailto:info@mediawole.com"&gt;mailto:info@mediawole.com&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/158104178192097877-741658741483839398?l=blog.mediawhole.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DirtyWords?a=Bcbb97CiiiU:3lVb3FptMjY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DirtyWords?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DirtyWords?a=Bcbb97CiiiU:3lVb3FptMjY:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DirtyWords?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DirtyWords/~4/Bcbb97CiiiU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.mediawhole.com/feeds/741658741483839398/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.mediawhole.com/2010/10/mysterious-sourceid-attribute.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/158104178192097877/posts/default/741658741483839398?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/158104178192097877/posts/default/741658741483839398?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DirtyWords/~3/Bcbb97CiiiU/mysterious-sourceid-attribute.html" title="The Mysterious SourceID Attribute" /><author><name>Michael Hanes</name><uri>http://www.blogger.com/profile/01877569030107816208</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/-a7o_YpicYcQ/TqirMmZt3HI/AAAAAAAADiM/N8xoftyG-0k/s220/Michael%2BHanes%2BCropped%2B2.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.mediawhole.com/2010/10/mysterious-sourceid-attribute.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE8GSHY9fSp7ImA9Wx5VGUk.&quot;"><id>tag:blogger.com,1999:blog-158104178192097877.post-8691326092197184400</id><published>2010-10-13T12:07:00.001+08:00</published><updated>2010-10-13T12:07:09.865+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-10-13T12:07:09.865+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="Web Development" /><category scheme="http://www.blogger.com/atom/ns#" term="SharePoint" /><category scheme="http://www.blogger.com/atom/ns#" term="Browsers" /><title>SharePoint and Chrome - Better Together</title><content type="html">&lt;p&gt;I've been &lt;a href="http://blog.mediawhole.com/2008/09/i-love-google-chrome.html"&gt;using Google's Chrome browser&lt;/a&gt; since its first release in 2008; I've loved nearly every second of the experience. Who would've thought there was room left to innovate in the browser space? Chrome's omnibar and rapid-fire JavaScript rendering, among other tweaks, are simply light years ahead of the competition. &lt;/p&gt;  &lt;p&gt;While I normally rely on IE for my MOSS/SharePoint editing interactions, as of late I'm making the switch to Chrome in that space as well. What I've found to date has blown my mind. &lt;/p&gt;  &lt;p&gt;Yes the MOSS 2007 UI degrades somewhat but it's still very useable. More importantly, Chrome &lt;em&gt;drastically&lt;/em&gt; reduces the time it takes to accomplish basic tasks like modifying page content or viewing list data. I'm not saying these are normally slow in SharePoint but they can be in the &lt;a href="http://www.westernaustralia.com"&gt;www.westernaustralia.com&lt;/a&gt; environment (it's an ageing site with a lot of content and a lot of customisations); some pages in particular nearly grind to a halt in IE8 with the corresponding process consuming upwards of 1GB of memory the more I interact with the page. &lt;/p&gt;  &lt;p&gt;Chrome &amp;quot;fixes&amp;quot; many of these slowdowns I'd previously attributed to the SharePoint environment and gives me all the Chrome goodness I've come to love over the last two years. It almost makes the SharePoint editing experience pleasurable!&lt;/p&gt; &lt;center&gt;If you found this post helpful, please support my advertisers. &lt;/center&gt;&lt;center&gt;   &lt;table&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td&gt;&lt;script type="text/javascript" src="http://sharepointads.com/members/scripts/banner.php?a_aid=NA&amp;amp;a_bid=cde7edc2"&gt;&lt;/script&gt;&lt;/td&gt;          &lt;td&gt;&lt;script type="text/javascript" src="http://sharepointads.com/members/scripts/banner.php?a_aid=NA&amp;amp;a_bid=48840e1d"&gt;&lt;/script&gt;&lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/center&gt;  &lt;div class="blogger-post-footer"&gt;Dirty Words (Michael Hanes) - &lt;a href="http://blog.mediawhole.com"&gt;blog.mediawhole.com&lt;/a&gt;
&lt;a href="mailto:info@mediawole.com"&gt;mailto:info@mediawole.com&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/158104178192097877-8691326092197184400?l=blog.mediawhole.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DirtyWords?a=ZLk9cot5WQo:nOTd_G_MMn4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DirtyWords?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DirtyWords?a=ZLk9cot5WQo:nOTd_G_MMn4:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DirtyWords?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DirtyWords/~4/ZLk9cot5WQo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.mediawhole.com/feeds/8691326092197184400/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.mediawhole.com/2010/10/sharepoint-and-chrome-better-together.html#comment-form" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/158104178192097877/posts/default/8691326092197184400?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/158104178192097877/posts/default/8691326092197184400?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DirtyWords/~3/ZLk9cot5WQo/sharepoint-and-chrome-better-together.html" title="SharePoint and Chrome - Better Together" /><author><name>Michael Hanes</name><uri>http://www.blogger.com/profile/01877569030107816208</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/-a7o_YpicYcQ/TqirMmZt3HI/AAAAAAAADiM/N8xoftyG-0k/s220/Michael%2BHanes%2BCropped%2B2.jpg" /></author><thr:total>4</thr:total><feedburner:origLink>http://blog.mediawhole.com/2010/10/sharepoint-and-chrome-better-together.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEYFSXwyfyp7ImA9Wx5XFE8.&quot;"><id>tag:blogger.com,1999:blog-158104178192097877.post-7705602042208199624</id><published>2010-09-13T18:17:00.000+08:00</published><updated>2010-09-14T09:01:58.297+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-09-14T09:01:58.297+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Things to Remember" /><category scheme="http://www.blogger.com/atom/ns#" term="Javascript" /><category scheme="http://www.blogger.com/atom/ns#" term=".NET" /><category scheme="http://www.blogger.com/atom/ns#" term="AJAX" /><category scheme="http://www.blogger.com/atom/ns#" term="Web Services" /><category scheme="http://www.blogger.com/atom/ns#" term="Web Development" /><category scheme="http://www.blogger.com/atom/ns#" term="How-To" /><title>How to pass JSON arrays and other data types to an ASMX web service</title><content type="html">&lt;p&gt;Ah interoperability… great fun, great fun.&lt;/p&gt;  &lt;p&gt;So jQuery is your new best friend and, along with JSON, there's nuthin' you can't do. The server side stuff is still there in the background and you've got some old school ASP.NET (.asmx) web services hanging around but DOM elements are otherwise flying all over the place, postbacks are just so passé, and even the marketing girls are mildly impressed at your skillz. You're branching out, shifting code and complexity from the server to the browser, and it's time to do some heavier data shunting. Here a few things to know about passing JSON data to an ASMX web service that may help you on your way…&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;JSON.stringify&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Know it, use it, love it. It's part of the &lt;a href="http://www.json.org/json2.js"&gt;JSON2&lt;/a&gt; library and you need it if you don't have it already. Use it to prepare (aka properly encode) your JSON data before sending it off to the big mean ol' web server:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt; data: {&amp;quot;days&amp;quot;: JSON.stringify([&amp;quot;Mon&amp;quot;, &amp;quot;Tues&amp;quot;])}&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;That will encode as &amp;amp;days=[&amp;quot;Monday&amp;quot;,&amp;quot;Tuesday&amp;quot;]&lt;/p&gt;  &lt;p&gt;Yeah, I know, it's another file to download but the guy who wrote JSON also wrote this and it can be merged and minified. I've tried writing my own mini-version as a function and while this works for simple strings, save yourself some time when it comes to arrays and the like and just use this sucker. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Arrays&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Arrays seem trickier than they should… maybe I'm just a dumb guy—probably. Anyway, you &lt;em&gt;can &lt;/em&gt;pass a JSON array to an .asmx web service without much work at all. &lt;/p&gt;  &lt;p&gt;The client-side call listed above is everything you need to do from that end. On the server side, create yourself a new web service method with a List&amp;lt;string&amp;gt; parameter:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;[WebMethod]     &lt;br /&gt;[ScriptMethod (UseHttpGet = true, ResponseFormat = ResponseFormat.Json)]      &lt;br /&gt;public string ConsumeArray (List&amp;lt;string&amp;gt; days)      &lt;br /&gt;{…}&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;That's all there is to it. If you're not passing in strings, declare the List&amp;lt;&amp;gt; parameter with a type of object or something else. You can use .NET arrays in the web method signature as well if you really want (need) to.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Integers&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;When in doubt, stringify:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt; data: { &amp;quot;i&amp;quot;: JSON.stringify(2) }&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;An int parameter on the web service end will handle this graciously. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Booleans&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;The good ol' boolean—a simple concept computer science has managed to bastardise like no other…&lt;/p&gt;  &lt;p&gt;When in doubt, stringify:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt; data: { &amp;quot;b&amp;quot;: jsonpEncode(&amp;quot;true&amp;quot;) }&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Like the int parameter, a bool in your web method signature will take care of this.&lt;/p&gt;  &lt;p&gt;A brief note: JSON, or rather jQuery's &lt;a href="http://api.jquery.com/jQuery.parseJSON/"&gt;parseJSON&lt;/a&gt; function, is a particular beast and doesn't seem to know about anything other than the &lt;em&gt;lower case &lt;/em&gt;true and false strings. If, for any reason, you ToString a bool in your .NET web service and try to pass it back, parseJSON will fail. If you forget to brush your teeth in the morning, parseJSON will fail. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Dates&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Sorry, on my todo list ;-)&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Tools&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;When working through this stuff, it pays to have &lt;a href="http://www.fiddler2.com"&gt;Fiddler&lt;/a&gt; open to inspect the requests you're sending through and any error messages you're getting back. I find Fiddler sometimes breaks this stuff so try turning off the capture if you're getting weird errors; optionally, revert to Firebug (Firefox only, of course).&lt;/p&gt;  &lt;p&gt;Fully decoding the data you sniff from a JSONP request passed along in the query string will require some additional tooling; in short, you'll want to decode the value using a free online tool like Opinionated Geek's &lt;a href="http://www.opinionatedgeek.com/dotnet/tools/urlencode/Decode.aspx"&gt;URL decoder&lt;/a&gt;.&lt;/p&gt; &lt;center&gt;If you found this post helpful, please support my advertisers. &lt;/center&gt;&lt;center&gt;   &lt;table&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td&gt;&lt;script type="text/javascript" src="http://sharepointads.com/members/scripts/banner.php?a_aid=NA&amp;amp;a_bid=cde7edc2"&gt;&lt;/script&gt;&lt;/td&gt;          &lt;td&gt;&lt;script type="text/javascript" src="http://sharepointads.com/members/scripts/banner.php?a_aid=NA&amp;amp;a_bid=48840e1d"&gt;&lt;/script&gt;&lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/center&gt;  &lt;div class="blogger-post-footer"&gt;Dirty Words (Michael Hanes) - &lt;a href="http://blog.mediawhole.com"&gt;blog.mediawhole.com&lt;/a&gt;
&lt;a href="mailto:info@mediawole.com"&gt;mailto:info@mediawole.com&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/158104178192097877-7705602042208199624?l=blog.mediawhole.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DirtyWords?a=HdnZIyurLZ0:QKNd4YeA3uU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DirtyWords?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DirtyWords?a=HdnZIyurLZ0:QKNd4YeA3uU:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DirtyWords?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DirtyWords/~4/HdnZIyurLZ0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.mediawhole.com/feeds/7705602042208199624/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.mediawhole.com/2010/09/how-to-pass-json-arrays-and-other-data.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/158104178192097877/posts/default/7705602042208199624?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/158104178192097877/posts/default/7705602042208199624?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DirtyWords/~3/HdnZIyurLZ0/how-to-pass-json-arrays-and-other-data.html" title="How to pass JSON arrays and other data types to an ASMX web service" /><author><name>Michael Hanes</name><uri>http://www.blogger.com/profile/01877569030107816208</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/-a7o_YpicYcQ/TqirMmZt3HI/AAAAAAAADiM/N8xoftyG-0k/s220/Michael%2BHanes%2BCropped%2B2.jpg" /></author><thr:total>2</thr:total><feedburner:origLink>http://blog.mediawhole.com/2010/09/how-to-pass-json-arrays-and-other-data.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkIEQXk4cSp7ImA9Wx5QGU4.&quot;"><id>tag:blogger.com,1999:blog-158104178192097877.post-1622907757599282511</id><published>2010-09-08T17:35:00.000+08:00</published><updated>2010-09-08T17:35:00.739+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-09-08T17:35:00.739+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Things to Remember" /><category scheme="http://www.blogger.com/atom/ns#" term=".NET" /><category scheme="http://www.blogger.com/atom/ns#" term="Batch Files" /><category scheme="http://www.blogger.com/atom/ns#" term="Windows" /><category scheme="http://www.blogger.com/atom/ns#" term="Debugging" /><title>Exposing the Global Assembly Cache</title><content type="html">&lt;p&gt;If you're familiar with the Global Assembly Cache (GAC) you're probably aware there's a special file system viewer thingy (technical term) sitting over top of the GAC contents at c:\windows\assembly; this is a nice convenience when it comes to registering assemblies in the GAC—simply drag and drop, avoiding a trip to the command line and gacutil –i&lt;/p&gt;  &lt;p&gt;More often than not, this is all good. When you need to dive into the &lt;em&gt;real&lt;/em&gt; GAC, to extract an assembly, drop in debugging symbols, or whatever, you'll quickly realise the viewer is somewhat limiting. &lt;/p&gt;  &lt;p&gt;To get past the GAC's outer facade, you've got a few options:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;From a command line, browse to c:\windows\assembly\gac_msil &lt;/li&gt;    &lt;li&gt;Map a network drive to \\machine-name\c$\windows\assembly\gac_msil &lt;/li&gt;    &lt;li&gt;Create a virtual drive: subst z: c:\windows\assembly\gac_msil where 'z:' is any unmapped drive letter &lt;/li&gt;    &lt;li&gt;Start –&amp;gt; Run c:\windows\assembly\gac_msil &lt;/li&gt;    &lt;li&gt;Turn off the viewer altogether to browse the GAC directory structure normally within Windows Explorer: create a new DWORD named DisableCacheViewer with a value of 1 below the HKLM\Software\Microsoft\Fusion key &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Five ways to do the same thing? Well this is Windows after all—and there are probably more!!! ;)&lt;/p&gt;  &lt;p&gt;If you drop the gac_msil bit you'll find there are other directories that make up the GAC proper to explorer but most of what you'll be after resides below gac_msil. Each assembly is represented in by name as a folder with different versions represented as sub folders named as the version number with a GUID appended; the assembly proper will live in one of these folders.&lt;/p&gt; &lt;center&gt;If you found this post helpful, please support my advertisers. &lt;/center&gt;&lt;center&gt;   &lt;table&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td&gt;&lt;script type="text/javascript" src="http://sharepointads.com/members/scripts/banner.php?a_aid=NA&amp;amp;a_bid=cde7edc2"&gt;&lt;/script&gt;&lt;/td&gt;          &lt;td&gt;&lt;script type="text/javascript" src="http://sharepointads.com/members/scripts/banner.php?a_aid=NA&amp;amp;a_bid=48840e1d"&gt;&lt;/script&gt;&lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/center&gt;  &lt;div class="blogger-post-footer"&gt;Dirty Words (Michael Hanes) - &lt;a href="http://blog.mediawhole.com"&gt;blog.mediawhole.com&lt;/a&gt;
&lt;a href="mailto:info@mediawole.com"&gt;mailto:info@mediawole.com&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/158104178192097877-1622907757599282511?l=blog.mediawhole.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DirtyWords?a=5GuFBYJq3Uo:FCLKSpjF5Zo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DirtyWords?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DirtyWords?a=5GuFBYJq3Uo:FCLKSpjF5Zo:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DirtyWords?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DirtyWords/~4/5GuFBYJq3Uo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.mediawhole.com/feeds/1622907757599282511/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.mediawhole.com/2010/09/exposing-global-assembly-cache.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/158104178192097877/posts/default/1622907757599282511?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/158104178192097877/posts/default/1622907757599282511?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DirtyWords/~3/5GuFBYJq3Uo/exposing-global-assembly-cache.html" title="Exposing the Global Assembly Cache" /><author><name>Michael Hanes</name><uri>http://www.blogger.com/profile/01877569030107816208</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/-a7o_YpicYcQ/TqirMmZt3HI/AAAAAAAADiM/N8xoftyG-0k/s220/Michael%2BHanes%2BCropped%2B2.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.mediawhole.com/2010/09/exposing-global-assembly-cache.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUYGQXs_cCp7ImA9Wx5QGU4.&quot;"><id>tag:blogger.com,1999:blog-158104178192097877.post-5709303677444560676</id><published>2010-09-08T17:12:00.000+08:00</published><updated>2010-09-08T17:12:00.548+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-09-08T17:12:00.548+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Things to Remember" /><category scheme="http://www.blogger.com/atom/ns#" term="SharePoint 2010" /><category scheme="http://www.blogger.com/atom/ns#" term="Visual Studio" /><category scheme="http://www.blogger.com/atom/ns#" term="How-To" /><title>Changing a VS2010 SharePoint package name</title><content type="html">&lt;p&gt;The SharePoint development tooling built into Visual Studio 2010 does a pretty good job at hiding some of the ugly bits involved in creating a SharePoint solution file. No longer must we deal with ddf files (hooray!) but we also lose some control (or, at the very least, have to dig a bit further to change some things that were previously &amp;quot;easy&amp;quot; in the broader context of &amp;quot;really painful&amp;quot;). &lt;/p&gt;  &lt;p&gt;One of those things that we previously had full control over was the name of the solution file (.wsp) that results from our ddf file and the mighty makecab.exe. While the file name is now set from within Visual Studio, you have to open the package designer before being presented with the package properties:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_kuHIq0i1UO4/TIbxGSjbBaI/AAAAAAAADX4/CKVV9TiA_zg/s1600-h/Rename-solution-file-vs2010%5B3%5D.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Rename-solution-file-vs2010" border="0" alt="Rename-solution-file-vs2010" src="http://lh6.ggpht.com/_kuHIq0i1UO4/TIbxHgDhalI/AAAAAAAADX8/gapA6KkHHmg/Rename-solution-file-vs2010_thumb%5B1%5D.png?imgmax=800" width="295" height="286" /&gt;&lt;/a&gt;     &lt;br /&gt;Simply clicking on the Package.package file will present you with the file properties which is not what you want—you have to double-click/open the package designer.&lt;/p&gt;  &lt;p&gt;The one thing I used to do with the ol' ddf file was specify the extension as &lt;em&gt;.cab&lt;/em&gt; instead of &lt;em&gt;.wsp&lt;/em&gt;. This was a convenience thing—SharePoint doesn't care about the extension (or at least doesn't object to .cab files)—but a .cab file will open in Windows Explorer on machines where you don't have a better archive tool installed like my favourite, &lt;a href="http://www.7-zip.org/"&gt;7zip&lt;/a&gt;. Essentially, it just saved me having to rename the file by hand. &lt;/p&gt;  &lt;p&gt;Unfortunately I have yet to find a way to do this with VS2010; the package name is only that—Visual Studio appends &amp;quot;.wsp&amp;quot; to the end of whatever name you supply and I can't find a way to override that behaviour. In truth I'll probably just start using .wsp like everyone else but it may be possible to tweak the file name in one of the pre/post events.&lt;/p&gt; &lt;center&gt;If you found this post helpful, please support my advertisers. &lt;/center&gt;&lt;center&gt;   &lt;table&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td&gt;&lt;script type="text/javascript" src="http://sharepointads.com/members/scripts/banner.php?a_aid=NA&amp;amp;a_bid=cde7edc2"&gt;&lt;/script&gt;&lt;/td&gt;          &lt;td&gt;&lt;script type="text/javascript" src="http://sharepointads.com/members/scripts/banner.php?a_aid=NA&amp;amp;a_bid=48840e1d"&gt;&lt;/script&gt;&lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/center&gt;  &lt;div class="blogger-post-footer"&gt;Dirty Words (Michael Hanes) - &lt;a href="http://blog.mediawhole.com"&gt;blog.mediawhole.com&lt;/a&gt;
&lt;a href="mailto:info@mediawole.com"&gt;mailto:info@mediawole.com&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/158104178192097877-5709303677444560676?l=blog.mediawhole.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DirtyWords?a=RGFDUqpnjTs:aGq72v3OuE8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DirtyWords?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DirtyWords?a=RGFDUqpnjTs:aGq72v3OuE8:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DirtyWords?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DirtyWords/~4/RGFDUqpnjTs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.mediawhole.com/feeds/5709303677444560676/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.mediawhole.com/2010/09/changing-vs2010-sharepoint-package-name.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/158104178192097877/posts/default/5709303677444560676?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/158104178192097877/posts/default/5709303677444560676?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DirtyWords/~3/RGFDUqpnjTs/changing-vs2010-sharepoint-package-name.html" title="Changing a VS2010 SharePoint package name" /><author><name>Michael Hanes</name><uri>http://www.blogger.com/profile/01877569030107816208</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/-a7o_YpicYcQ/TqirMmZt3HI/AAAAAAAADiM/N8xoftyG-0k/s220/Michael%2BHanes%2BCropped%2B2.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/_kuHIq0i1UO4/TIbxHgDhalI/AAAAAAAADX8/gapA6KkHHmg/s72-c/Rename-solution-file-vs2010_thumb%5B1%5D.png?imgmax=800" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://blog.mediawhole.com/2010/09/changing-vs2010-sharepoint-package-name.html</feedburner:origLink></entry></feed>

