<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/rss2full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" version="2.0">
  <channel>
    <title>Code Assassin</title>
    <link>http://www.codeassassin.com/blog/</link>
    <description>Silently disposing your objects in the dead of night</description>
    <language>en-au</language>
    <copyright>Jason Stangroome</copyright>
    <lastBuildDate>Mon, 04 Aug 2008 07:05:34 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 1.9.6264.0</generator>
    <managingEditor>contact@codeassassin.com</managingEditor>
    <webMaster>contact@codeassassin.com</webMaster>
    <geo:lat>-34.91808</geo:lat><geo:long>138.51485</geo:long><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/CodeAssassin" type="application/rss+xml" /><item>
      <trackback:ping>http://www.codeassassin.com/blog/Trackback.aspx?guid=3752f97b-bcc6-463c-9cbb-00f387d76c19</trackback:ping>
      <pingback:server>http://www.codeassassin.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.codeassassin.com/blog/PermaLink,guid,3752f97b-bcc6-463c-9cbb-00f387d76c19.aspx</pingback:target>
      <dc:creator>Jason</dc:creator>
      <wfw:comment>http://www.codeassassin.com/blog/CommentView,guid,3752f97b-bcc6-463c-9cbb-00f387d76c19.aspx</wfw:comment>
      <wfw:commentRss>http://www.codeassassin.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=3752f97b-bcc6-463c-9cbb-00f387d76c19</wfw:commentRss>
      
      <title>Binding... and IList&amp;lt;T&amp;gt; does not inherit from IList.</title>
      <guid isPermaLink="false">http://www.codeassassin.com/blog/PermaLink,guid,3752f97b-bcc6-463c-9cbb-00f387d76c19.aspx</guid>
      <link>http://www.codeassassin.com/blog/PermaLink,guid,3752f97b-bcc6-463c-9cbb-00f387d76c19.aspx</link>
      <pubDate>Mon, 04 Aug 2008 07:05:34 GMT</pubDate>
      <description>&lt;p&gt;&#xD;
A note to myself, and to others who may find it useful:&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Use &lt;a href="http://msdn.microsoft.com/en-us/library/ms132397.aspx" target="_blank"&gt;System.Collections.ObjectModel.Collection&amp;lt;T&amp;gt;&lt;/a&gt; (or&#xD;
a subclass) as the return type for properties exposing collections of related items&#xD;
on your presentation model classes if you intend to bind to the relationships with&#xD;
Windows Forms &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.forms.bindingsource.aspx" target="_blank"&gt;BindingSources&lt;/a&gt;.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Collection&amp;lt;T&amp;gt; appears to be the lowest-level type in Framework 3.5 that provides&#xD;
both the non-generic IList implementation as required by the binding system and also&#xD;
provides strongly-typed programmatic access to the elements of the collection. It&#xD;
is used as the base for BindingList&amp;lt;T&amp;gt;, ObservableCollection&amp;lt;T&amp;gt; and many&#xD;
others and you can easily inherit from it yourself.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Using a return type of IList&amp;lt;T&amp;gt; or ICollection&amp;lt;T&amp;gt; instead, which may be&#xD;
preferred for being less concrete, is &lt;strong&gt;not &lt;/strong&gt;sufficient as neither of&#xD;
these inherit from the non-generic IList and will fail to bind correctly (sometimes&#xD;
throwing exceptions) at run-time when the parent list of the bound relationship is&#xD;
empty.&#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://www.codeassassin.com/blog/aggbug.ashx?id=3752f97b-bcc6-463c-9cbb-00f387d76c19"&gt;&lt;/img&gt;&#xD;
      &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/CodeAssassin?a=GIs9yK"&gt;&lt;img src="http://feeds.feedburner.com/~f/CodeAssassin?i=GIs9yK" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CodeAssassin?a=CoTzGK"&gt;&lt;img src="http://feeds.feedburner.com/~f/CodeAssassin?i=CoTzGK" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CodeAssassin?a=r3Q1Ok"&gt;&lt;img src="http://feeds.feedburner.com/~f/CodeAssassin?i=r3Q1Ok" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CodeAssassin?a=x0wcxk"&gt;&lt;img src="http://feeds.feedburner.com/~f/CodeAssassin?i=x0wcxk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CodeAssassin?a=PIuxvK"&gt;&lt;img src="http://feeds.feedburner.com/~f/CodeAssassin?i=PIuxvK" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodeAssassin/~4/355076621" height="1" width="1"/&gt;</description>
      <comments>http://www.codeassassin.com/blog/CommentView,guid,3752f97b-bcc6-463c-9cbb-00f387d76c19.aspx</comments>
      <category>.NET Framework</category>
    </item>
    <item>
      <trackback:ping>http://www.codeassassin.com/blog/Trackback.aspx?guid=d2cd786d-4233-4fd1-ba15-250fa33c8148</trackback:ping>
      <pingback:server>http://www.codeassassin.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.codeassassin.com/blog/PermaLink,guid,d2cd786d-4233-4fd1-ba15-250fa33c8148.aspx</pingback:target>
      <dc:creator>Jason</dc:creator>
      <wfw:comment>http://www.codeassassin.com/blog/CommentView,guid,d2cd786d-4233-4fd1-ba15-250fa33c8148.aspx</wfw:comment>
      <wfw:commentRss>http://www.codeassassin.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=d2cd786d-4233-4fd1-ba15-250fa33c8148</wfw:commentRss>
      
      <title>Adelaide Geek Dinner August 2008 Announcement</title>
      <guid isPermaLink="false">http://www.codeassassin.com/blog/PermaLink,guid,d2cd786d-4233-4fd1-ba15-250fa33c8148.aspx</guid>
      <link>http://www.codeassassin.com/blog/PermaLink,guid,d2cd786d-4233-4fd1-ba15-250fa33c8148.aspx</link>
      <pubDate>Fri, 01 Aug 2008 12:07:48 GMT</pubDate>
      <description>&lt;p&gt;&#xD;
As &lt;a href="http://www.codeassassin.com/blog/PermaLink,guid,ac5db07c-f73c-40a2-9077-474025f3f953.aspx" target="_blank"&gt;promised&#xD;
in May&lt;/a&gt;, it is time for the August Geek Dinner, specifically the time will be 6:30pm&#xD;
on Saturday 16th August. Everyone seemed to enjoy the food and atmosphere of &lt;a href="http://www.cafeamore.com.au/" target="_blank"&gt;Caffe&#xD;
Amore&lt;/a&gt; on the corner of Pulteney and Pirie Streets last time so we'll be going&#xD;
there again this time.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
If you're already on the geek dinner mailing list from previous times expect an invitation&#xD;
shortly. If you've never been invited before or you think your invite may be lost&#xD;
in the mail, just contact me and I'll make sure you get included.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Please RSVP before Wednesday 13th August so I can finalise the booking with the restaurant.&#xD;
Hope to see you all there!&#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://www.codeassassin.com/blog/aggbug.ashx?id=d2cd786d-4233-4fd1-ba15-250fa33c8148"&gt;&lt;/img&gt;&#xD;
      &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/CodeAssassin?a=gDOLXK"&gt;&lt;img src="http://feeds.feedburner.com/~f/CodeAssassin?i=gDOLXK" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CodeAssassin?a=VQFLrK"&gt;&lt;img src="http://feeds.feedburner.com/~f/CodeAssassin?i=VQFLrK" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CodeAssassin?a=51KC2k"&gt;&lt;img src="http://feeds.feedburner.com/~f/CodeAssassin?i=51KC2k" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CodeAssassin?a=IECDBk"&gt;&lt;img src="http://feeds.feedburner.com/~f/CodeAssassin?i=IECDBk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CodeAssassin?a=aIzjVK"&gt;&lt;img src="http://feeds.feedburner.com/~f/CodeAssassin?i=aIzjVK" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodeAssassin/~4/352552703" height="1" width="1"/&gt;</description>
      <comments>http://www.codeassassin.com/blog/CommentView,guid,d2cd786d-4233-4fd1-ba15-250fa33c8148.aspx</comments>
      <category>Geek Dinner</category>
    </item>
    <item>
      <trackback:ping>http://www.codeassassin.com/blog/Trackback.aspx?guid=45aa2cca-09b4-4955-b573-5b8a915d4c25</trackback:ping>
      <pingback:server>http://www.codeassassin.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.codeassassin.com/blog/PermaLink,guid,45aa2cca-09b4-4955-b573-5b8a915d4c25.aspx</pingback:target>
      <dc:creator>Jason</dc:creator>
      <wfw:comment>http://www.codeassassin.com/blog/CommentView,guid,45aa2cca-09b4-4955-b573-5b8a915d4c25.aspx</wfw:comment>
      <wfw:commentRss>http://www.codeassassin.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=45aa2cca-09b4-4955-b573-5b8a915d4c25</wfw:commentRss>
      <slash:comments>1</slash:comments>
      
      <title>TFS Deployer Least Privilege</title>
      <guid isPermaLink="false">http://www.codeassassin.com/blog/PermaLink,guid,45aa2cca-09b4-4955-b573-5b8a915d4c25.aspx</guid>
      <link>http://www.codeassassin.com/blog/PermaLink,guid,45aa2cca-09b4-4955-b573-5b8a915d4c25.aspx</link>
      <pubDate>Sat, 05 Jul 2008 00:54:16 GMT</pubDate>
      <description>&lt;p&gt;&#xD;
The original &lt;a href="http://www.codeplex.com/tfsdeployer" target="_blank"&gt;TFS Deployer&lt;/a&gt; attempted&#xD;
to access various restricted resources than effectively required it to run as an administrator&#xD;
user. Since some changes were made in February, Deployer can now be executed under&#xD;
a standard user account with some additional considerations which follow.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;strong&gt;Team Foundation Server Permissions&lt;/strong&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The TFS Deployer service account must be a member of the Team Foundation Valid Users&#xD;
server-level group on the server specified by the TeamFoundationServerUrl config setting&#xD;
and also a member of the Readers project-level group for the Team Projects that Deployer&#xD;
will be monitoring.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
If you intend to make use of the &lt;a href="http://www.codeassassin.com/blog/PermaLink,guid,9121ee83-17b9-4b02-872c-d0a9e182aad8.aspx" target="_blank"&gt;Retain&#xD;
Build feature&lt;/a&gt;, the Deployer service account will also need the Write To Operational&#xD;
Build Store project-level permission on applicable Team Projects.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;strong&gt;PowerShell Execution Policy&lt;/strong&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
TFS Deployer can execute Windows Command Scripts if you really need it to but PowerShell&#xD;
scripts are the preferred option. However, PowerShell is built to be secure-by-default&#xD;
and installs with script-running capabilities disabled. It is left for the user to&#xD;
enable scripts after PowerShell has been installed and can be performed by opening&#xD;
the PowerShell console as an administrator and executing either:&#xD;
&lt;/p&gt;&#xD;
        &lt;pre&gt;Set-ExecutionPolicy AllSigned ; # or&lt;br&gt;&#xD;
Set-ExecutionPolicy RemoteSigned&lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
The former choice will require you to sign all your deployment scripts in source control&#xD;
with a certificate trusted by the Deployer. &lt;a href="http://www.hanselman.com/blog/" target="_blank"&gt;Scott&#xD;
Hanselman&lt;/a&gt; has a comprehensive post on his blog describing the &lt;a href="http://www.hanselman.com/blog/SigningPowerShellScripts.aspx" target="_blank"&gt;signing&#xD;
process&lt;/a&gt;. The latter choice &lt;a href="http://blogs.msdn.com/powershell/archive/2007/03/07/how-does-the-remotesigned-execution-policy-work.aspx" target="_blank"&gt;will&#xD;
not impose this requirement&lt;/a&gt; because files retrieved from source control by Deployer&#xD;
are not marked with a zone identifier.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;strong&gt;HTTP Namespace Reservation&lt;/strong&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
TFS Deployer utilises self-hosted WCF over HTTP to subscribe to Build Quality Change&#xD;
events from TFS. This technique relies on the Windows HTTP Server API which requires&#xD;
the Deployer service account to have been granted rights to listen on the portion&#xD;
of the HTTP URL namespace it uses for event notification. By default only local administrators&#xD;
have access to the entire namespace and permissions must be granted using the httpcfg&#xD;
tool (on Windows XP and Server 2003) or the netsh tool (on Vista and Server 2008).&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Using the netsh tool, from an administrator command prompt, the following command&#xD;
(as a single line) will grant rights to the appropriate URL for TFS Deployer (assuming&#xD;
you are using the default port number):&#xD;
&lt;/p&gt;&#xD;
        &lt;pre&gt;netsh http add urlacl url=http://+:8881/BuildStatusChangeEvent user=DOMAIN\TfsDeployerUser&lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://msdn.microsoft.com/en-us/library/ms733768.aspx" target="_blank"&gt;Using&#xD;
the httpcfg tool&lt;/a&gt; is more difficult as it requires an ACL string in Security Descriptor&#xD;
Definition Language (SDDL). However, &lt;a href="http://www.leastprivilege.com/" target="_blank"&gt;Dominick&#xD;
Baier&lt;/a&gt; has &lt;a href="http://www.leastprivilege.com/URIACLsAndWCFRevisited.aspx" target="_blank"&gt;created&#xD;
a tool&lt;/a&gt; to simplify this process and I can recommend it. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;strong&gt;Additional Permissions&lt;/strong&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
All deployment scripts executed by TFS Deployer will be executed under the context&#xD;
of the service account unless the scripts explicitly contain alternate credentials.&#xD;
If the scripts copy files to a network share, configure a web site in IIS, or even&#xD;
upgrade the schema of a SQL database, ensure that the service account also has the&#xD;
minimum privileges to perform those actions too.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Any problems, questions, or suggestions... let me know.&#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://www.codeassassin.com/blog/aggbug.ashx?id=45aa2cca-09b4-4955-b573-5b8a915d4c25"&gt;&lt;/img&gt;&#xD;
      &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/CodeAssassin?a=HrtHEJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/CodeAssassin?i=HrtHEJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CodeAssassin?a=V2okWJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/CodeAssassin?i=V2okWJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CodeAssassin?a=L6y8ij"&gt;&lt;img src="http://feeds.feedburner.com/~f/CodeAssassin?i=L6y8ij" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CodeAssassin?a=4pGMuj"&gt;&lt;img src="http://feeds.feedburner.com/~f/CodeAssassin?i=4pGMuj" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CodeAssassin?a=QVON5J"&gt;&lt;img src="http://feeds.feedburner.com/~f/CodeAssassin?i=QVON5J" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodeAssassin/~4/327033172" height="1" width="1"/&gt;</description>
      <comments>http://www.codeassassin.com/blog/CommentView,guid,45aa2cca-09b4-4955-b573-5b8a915d4c25.aspx</comments>
      <category>Least Privilege;PowerShell;Team Foundation Server</category>
    </item>
    <item>
      <trackback:ping>http://www.codeassassin.com/blog/Trackback.aspx?guid=9121ee83-17b9-4b02-872c-d0a9e182aad8</trackback:ping>
      <pingback:server>http://www.codeassassin.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.codeassassin.com/blog/PermaLink,guid,9121ee83-17b9-4b02-872c-d0a9e182aad8.aspx</pingback:target>
      <dc:creator>Jason</dc:creator>
      <wfw:comment>http://www.codeassassin.com/blog/CommentView,guid,9121ee83-17b9-4b02-872c-d0a9e182aad8.aspx</wfw:comment>
      <wfw:commentRss>http://www.codeassassin.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=9121ee83-17b9-4b02-872c-d0a9e182aad8</wfw:commentRss>
      
      <title>Explaining new features in TFS Deployer</title>
      <guid isPermaLink="false">http://www.codeassassin.com/blog/PermaLink,guid,9121ee83-17b9-4b02-872c-d0a9e182aad8.aspx</guid>
      <link>http://www.codeassassin.com/blog/PermaLink,guid,9121ee83-17b9-4b02-872c-d0a9e182aad8.aspx</link>
      <pubDate>Wed, 02 Jul 2008 13:35:22 GMT</pubDate>
      <description>&lt;p&gt;&#xD;
Since I began helping &lt;a href="http://notgartner.wordpress.com/" target="_blank"&gt;Mitch&lt;/a&gt; with&#xD;
changes to &lt;a href="http://www.codeplex.com/tfsdeployer" target="_blank"&gt;TFS Deployer&lt;/a&gt; to&#xD;
make it compatible with TFS 2008, I have slowly been adding small features that seemed&#xD;
useful in my work environment. However, unless you've read the code, you probably&#xD;
wouldn't know they exist so I'll describe them here.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;strong&gt;Quality Mapping Wildcard&lt;/strong&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
TFS Deployer operates on executing scripts for particular build quality transitions.&#xD;
Normally transitions like "Test" to "Production" are common. However you may wish&#xD;
to have a script that runs when the quality is set to "QA" regardless of what is was&#xD;
before. You can now specify asterisk (*) in place of the value of either of the OriginalQuality&#xD;
or the NewQuality attributes in the DeploymentMappings.xml file to specify a match&#xD;
on any quality. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;strong&gt;Retain Build&lt;/strong&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Team Build in TFS 2008 now has Retention Policies to clean out old builds. If you&#xD;
deploy a build with TFS Deployer you don't want the policy deleting the build outputs.&#xD;
You may also want builds to become subject to policy again after you retire them from&#xD;
failed acceptance testing. You can add a RetainBuild attribute to a Mapping element&#xD;
in the D*M*.xml file. A value of "true" will mark the build to be kept upon successful&#xD;
execution of the deployment script. A value of "false" will unmark it, and an absent&#xD;
attribute will leave the retain flag alone.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;strong&gt;Shared Deployment Resources&lt;/strong&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
With multiple Team Builds defined and multiple deployment configurations you're bound&#xD;
to end up with scripts with common components you'd like to refactor out to a shared&#xD;
location. You can now specify a TFS path (ie $/MyProj/TeamBuildTypes/Shared/Deployment/)&#xD;
in the TfsDeployer.exe.config file in the SharedResourceServerPath application setting.&#xD;
If provided TFS Deployer will get the files in this directory and place them in the&#xD;
same folder as the deployment script on each script run.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The first two features are in the &lt;a href="http://www.codeplex.com/tfsdeployer/Release/ProjectReleases.aspx" target="_blank"&gt;latest&#xD;
release drop&lt;/a&gt; on CodePlex. The latter is only in the latest change set, so check&#xD;
the &lt;a href="http://www.codeplex.com/tfsdeployer/SourceControl/ListDownloadableCommits.aspx" target="_blank"&gt;Source&#xD;
Code&lt;/a&gt; tab if you intend to use shared resources. Any problems, questions, or suggestions...&#xD;
let me know.&#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://www.codeassassin.com/blog/aggbug.ashx?id=9121ee83-17b9-4b02-872c-d0a9e182aad8"&gt;&lt;/img&gt;&#xD;
      &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/CodeAssassin?a=dHYgqJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/CodeAssassin?i=dHYgqJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CodeAssassin?a=90NXvJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/CodeAssassin?i=90NXvJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CodeAssassin?a=1qiNXj"&gt;&lt;img src="http://feeds.feedburner.com/~f/CodeAssassin?i=1qiNXj" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CodeAssassin?a=lIDALj"&gt;&lt;img src="http://feeds.feedburner.com/~f/CodeAssassin?i=lIDALj" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CodeAssassin?a=PtdGeJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/CodeAssassin?i=PtdGeJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodeAssassin/~4/324898134" height="1" width="1"/&gt;</description>
      <comments>http://www.codeassassin.com/blog/CommentView,guid,9121ee83-17b9-4b02-872c-d0a9e182aad8.aspx</comments>
      <category>Team Foundation Server</category>
    </item>
    <item>
      <trackback:ping>http://www.codeassassin.com/blog/Trackback.aspx?guid=ac5db07c-f73c-40a2-9077-474025f3f953</trackback:ping>
      <pingback:server>http://www.codeassassin.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.codeassassin.com/blog/PermaLink,guid,ac5db07c-f73c-40a2-9077-474025f3f953.aspx</pingback:target>
      <dc:creator>Jason</dc:creator>
      <wfw:comment>http://www.codeassassin.com/blog/CommentView,guid,ac5db07c-f73c-40a2-9077-474025f3f953.aspx</wfw:comment>
      <wfw:commentRss>http://www.codeassassin.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=ac5db07c-f73c-40a2-9077-474025f3f953</wfw:commentRss>
      <slash:comments>1</slash:comments>
      
      <title>Adelaide Geek Dinner May 2008 Summary</title>
      <guid isPermaLink="false">http://www.codeassassin.com/blog/PermaLink,guid,ac5db07c-f73c-40a2-9077-474025f3f953.aspx</guid>
      <link>http://www.codeassassin.com/blog/PermaLink,guid,ac5db07c-f73c-40a2-9077-474025f3f953.aspx</link>
      <pubDate>Sat, 24 May 2008 06:56:08 GMT</pubDate>
      <description>&lt;p&gt;&#xD;
          &lt;a href="http://www.flickr.com/photos/jstangroome/2504508059/" target="_blank"&gt;&#xD;
            &lt;img style="MARGIN: 0px 0px 0px 10px; border: 0" alt="Photo of the guests" src="http://farm3.static.flickr.com/2398/2504508059_ff09f0702f_m.jpg" align="right"&gt;&lt;/img&gt;&#xD;
          &lt;/a&gt; The&#xD;
May Geek Dinner was long overdue but well worth the wait. I invited a record high&#xD;
number of people, fifteen, but due to a variety of circumstances, a record low number&#xD;
of people made it to the dinner: five, including myself.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
I was joined by the always entertaining regulars: &lt;a href="http://www.paulstovell.com/" target="_blank"&gt;Paul&#xD;
Stovell&lt;/a&gt;, &lt;a href="http://sanrez.com/" target="_blank"&gt;Keith Zerna&lt;/a&gt;, and &lt;a href="http://www.nervoustych.com/" target="_blank"&gt;Jim&#xD;
Burger&lt;/a&gt;. We were also pleased to be joined by &lt;a href="http://blog.spencen.com/" target="_blank"&gt;Nigel&#xD;
Spencer&lt;/a&gt; for the first time since I started organising the dinners last year.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Aside from the usual .NET subjects, many other topics were discussed on the night,&#xD;
here are some links in no particular order:&#xD;
&lt;/p&gt;&#xD;
        &lt;ul&gt;&#xD;
          &lt;li&gt;&#xD;
Clay Shirky on Social Surplus: &lt;a href="http://blip.tv/file/855937" target="_blank"&gt;video&lt;/a&gt;, &lt;a href="http://www.shirky.com/herecomeseverybody/2008/04/looking-for-the-mouse.html" target="_blank"&gt;transcript&lt;/a&gt;&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
Perfection Fresh's naturally grown &lt;a href="http://www.perfection.com.au/01_cms/details.asp?ID=791" target="_blank"&gt;Enchanted&#xD;
Apple&lt;/a&gt;&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
NASA's Mars Climate Orbiter &lt;a href="http://en.wikipedia.org/wiki/Mars_Climate_Orbiter#The_metric_mixup" target="_blank"&gt;metric&#xD;
mix-up&lt;/a&gt;&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
Self-reconfigurable robots (&lt;a href="http://technology.newscientist.com/channel/tech/mg19826531.200-shapeshifting-robots-take-form.html" target="_blank"&gt;article&#xD;
preview&lt;/a&gt;) &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
Are we approaching the &lt;a href="http://en.wikipedia.org/wiki/The_Great_Filter" target="_blank"&gt;Great&#xD;
Filter&lt;/a&gt;?&lt;/li&gt;&#xD;
        &lt;/ul&gt;&#xD;
        &lt;p&gt;&#xD;
I am writing this summary a week since the night of the dinner and I've managed to&#xD;
forget some of the night's events. Perhaps the other attendees could leave some comments&#xD;
with links to the interesting topics I've missed.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Watch this blog for details of the August 2008 Dinner which I'll likely post after &lt;a href="http://pgriffith.wordpress.com/2008/05/18/codecampsa/" target="_blank"&gt;Code&#xD;
Camp SA&lt;/a&gt;.&#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://www.codeassassin.com/blog/aggbug.ashx?id=ac5db07c-f73c-40a2-9077-474025f3f953"&gt;&lt;/img&gt;&#xD;
      &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/CodeAssassin?a=Vs5axH"&gt;&lt;img src="http://feeds.feedburner.com/~f/CodeAssassin?i=Vs5axH" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CodeAssassin?a=nyUkkH"&gt;&lt;img src="http://feeds.feedburner.com/~f/CodeAssassin?i=nyUkkH" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CodeAssassin?a=rKbL5h"&gt;&lt;img src="http://feeds.feedburner.com/~f/CodeAssassin?i=rKbL5h" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CodeAssassin?a=kMDvzh"&gt;&lt;img src="http://feeds.feedburner.com/~f/CodeAssassin?i=kMDvzh" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CodeAssassin?a=kqHHLH"&gt;&lt;img src="http://feeds.feedburner.com/~f/CodeAssassin?i=kqHHLH" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodeAssassin/~4/297063500" height="1" width="1"/&gt;</description>
      <comments>http://www.codeassassin.com/blog/CommentView,guid,ac5db07c-f73c-40a2-9077-474025f3f953.aspx</comments>
      <category>Geek Dinner</category>
    </item>
    <item>
      <trackback:ping>http://www.codeassassin.com/blog/Trackback.aspx?guid=c02c0178-ca6c-4714-bd2b-ebd2d0ac2a4b</trackback:ping>
      <pingback:server>http://www.codeassassin.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.codeassassin.com/blog/PermaLink,guid,c02c0178-ca6c-4714-bd2b-ebd2d0ac2a4b.aspx</pingback:target>
      <dc:creator>Jason</dc:creator>
      <wfw:comment>http://www.codeassassin.com/blog/CommentView,guid,c02c0178-ca6c-4714-bd2b-ebd2d0ac2a4b.aspx</wfw:comment>
      <wfw:commentRss>http://www.codeassassin.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=c02c0178-ca6c-4714-bd2b-ebd2d0ac2a4b</wfw:commentRss>
      
      <title>Using IDisposable and Lambdas for temporary values</title>
      <guid isPermaLink="false">http://www.codeassassin.com/blog/PermaLink,guid,c02c0178-ca6c-4714-bd2b-ebd2d0ac2a4b.aspx</guid>
      <link>http://www.codeassassin.com/blog/PermaLink,guid,c02c0178-ca6c-4714-bd2b-ebd2d0ac2a4b.aspx</link>
      <pubDate>Sat, 24 May 2008 05:09:39 GMT</pubDate>
      <description>&lt;p&gt;&#xD;
What follows is some code I wrote last week that I couldn't find anywhere else and&#xD;
I thought was useful. First, is a test method demonstrating my use case, followed&#xD;
by the implementation of the TemporaryValue classes to fulfil the requirement.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The property get lambda expression can be an instance or static property as long as&#xD;
it is read-write. In this implementation there is no exception handling and no multithreading&#xD;
considerations.&#xD;
&lt;/p&gt;&#xD;
        &lt;p class="code"&gt;&#xD;
[&lt;span class="type"&gt;TestMethod&lt;/span&gt;]&lt;br&gt;&lt;span class="keyword"&gt;public void&lt;/span&gt; Original_property_value_should_be_restored_after_temporary_value_block()&lt;br&gt;&#xD;
{&lt;br&gt;&#xD;
    &lt;span class="keyword"&gt;const string&lt;/span&gt; OriginalValue = &lt;span class="literal"&gt;"_original_value_"&lt;/span&gt;;&lt;br&gt;&#xD;
    &lt;span class="keyword"&gt;const string&lt;/span&gt; NewValue = &lt;span class="literal"&gt;"_new_value_"&lt;/span&gt;;&lt;br&gt;&#xD;
    &lt;span class="keyword"&gt;var&lt;/span&gt; f = &lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span class="type"&gt;Foo&lt;/span&gt; {Bar&#xD;
= OriginalValue};&lt;br&gt;&lt;br&gt;&#xD;
    &lt;span class="type"&gt;Assert&lt;/span&gt;.AreSame(OriginalValue, f.Bar);&lt;br&gt;&lt;br&gt;&#xD;
    &lt;span class="keyword"&gt;using&lt;/span&gt; (&lt;span class="type"&gt;TemporaryValue&lt;/span&gt;.For(()&#xD;
=&amp;gt; f.Bar, NewValue))&lt;br&gt;&#xD;
    {&lt;br&gt;&#xD;
        &lt;span class="type"&gt;Assert&lt;/span&gt;.AreSame(NewValue,&#xD;
f.Bar);&lt;br&gt;&#xD;
    }&lt;br&gt;&lt;br&gt;&#xD;
    &lt;span class="type"&gt;Assert&lt;/span&gt;.AreSame(OriginalValue, f.Bar);&lt;br&gt;&#xD;
}&#xD;
&lt;/p&gt;&#xD;
        &lt;p class="code"&gt;&#xD;
          &lt;span class="keyword"&gt;public static class&lt;/span&gt;&#xD;
          &lt;span class="type"&gt;TemporaryValue&lt;/span&gt; &lt;br&gt;&#xD;
{ &lt;br&gt;&#xD;
    &lt;span class="keyword"&gt;public static&lt;/span&gt;&lt;span class="type"&gt;TemporaryValue&lt;/span&gt;&lt;TVALUE&gt;&#xD;
For&lt;TVALUE&gt;&#xD;
(&lt;span class="type"&gt;Expression&lt;/span&gt;&amp;lt;&lt;span class="type"&gt;Func&lt;/span&gt;&lt;TVALUE&gt;&#xD;
&amp;gt; propertyGet, TValue newValue) &lt;br&gt;&#xD;
    { &lt;br&gt;&#xD;
        &lt;span class="keyword"&gt;return new&lt;/span&gt;&lt;span class="type"&gt;TemporaryValue&lt;/span&gt;&lt;TVALUE&gt;&#xD;
(propertyGet, newValue); &lt;br&gt;&#xD;
    } &lt;br&gt;&#xD;
} &lt;br&gt;&#xD;
 &lt;br&gt;&lt;span class="keyword"&gt;public class&lt;/span&gt;&lt;span class="type"&gt;TemporaryValue&lt;/span&gt;&lt;TVALUE&gt;&#xD;
: &lt;span class="type"&gt;IDisposable&lt;/span&gt; &lt;br&gt;&#xD;
{ &lt;br&gt;&#xD;
    &lt;span class="keyword"&gt;private&lt;/span&gt;&lt;span class="type"&gt;PropertyInfo&lt;/span&gt; _propertyInfo; &lt;br&gt;&#xD;
    &lt;span class="keyword"&gt;private object&lt;/span&gt; _target; &lt;br&gt;&#xD;
    &lt;span class="keyword"&gt;private&lt;/span&gt; TValue _original; &lt;br&gt;&#xD;
 &lt;br&gt;&#xD;
    &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span class="type"&gt;TemporaryValue&lt;/span&gt;(&lt;span class="type"&gt;Expression&lt;/span&gt;&amp;lt;&lt;span class="type"&gt;Func&lt;/span&gt;&lt;TVALUE&gt;&#xD;
&amp;gt; propertyGet, TValue newValue) &lt;br&gt;&#xD;
    { &lt;br&gt;&#xD;
        &lt;span class="keyword"&gt;var&lt;/span&gt; memberExpression&#xD;
= (&lt;span class="type"&gt;MemberExpression&lt;/span&gt;)propertyGet.Body; &lt;br&gt;&#xD;
        _propertyInfo = (&lt;span class="type"&gt;PropertyInfo&lt;/span&gt;)memberExpression.Member; &lt;br&gt;&#xD;
 &lt;br&gt;&#xD;
        &lt;span class="keyword"&gt;var&lt;/span&gt; targetExpression&#xD;
= memberExpression.&lt;span class="type"&gt;Expression&lt;/span&gt;; &lt;br&gt;&#xD;
        &lt;span class="keyword"&gt;if&lt;/span&gt; (&lt;span class="keyword"&gt;null&lt;/span&gt; !=&#xD;
targetExpression) &lt;br&gt;&#xD;
        { &lt;br&gt;&#xD;
            _target = &lt;span class="type"&gt;Expression&lt;/span&gt;.Lambda&amp;lt;&lt;span class="type"&gt;Func&lt;/span&gt;&amp;lt;&lt;span class="keyword"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;(targetExpression).Compile().Invoke(); &lt;br&gt;&#xD;
        } &lt;br&gt;&#xD;
 &lt;br&gt;&#xD;
        _original = propertyGet.Compile().Invoke(); &lt;br&gt;&#xD;
        Set(newValue); &lt;br&gt;&#xD;
    } &lt;br&gt;&#xD;
 &lt;br&gt;&#xD;
    &lt;span class="keyword"&gt;private void&lt;/span&gt; Set(TValue value) &lt;br&gt;&#xD;
    { &lt;br&gt;&#xD;
        _propertyInfo.SetValue(_target, value, &lt;span class="keyword"&gt;null&lt;/span&gt;); &lt;br&gt;&#xD;
    } &lt;br&gt;&#xD;
 &lt;br&gt;&#xD;
    &lt;span class="keyword"&gt;public void&lt;/span&gt; Dispose() &lt;br&gt;&#xD;
    { &lt;br&gt;&#xD;
        &lt;span class="keyword"&gt;if&lt;/span&gt; (&lt;span class="keyword"&gt;null&lt;/span&gt; !=&#xD;
_propertyInfo) &lt;br&gt;&#xD;
        { &lt;br&gt;&#xD;
            Set(_original); &lt;br&gt;&#xD;
            _propertyInfo&#xD;
= &lt;span class="keyword"&gt;null&lt;/span&gt;; &lt;br&gt;&#xD;
            _target = &lt;span class="keyword"&gt;null&lt;/span&gt;; &lt;br&gt;&#xD;
            _original&#xD;
= &lt;span class="keyword"&gt;default&lt;/span&gt;(TValue); &lt;br&gt;&#xD;
        } &lt;br&gt;&#xD;
    } &lt;br&gt;&#xD;
}&#xD;
&lt;/TVALUE&gt;&lt;/TVALUE&gt;&lt;/TVALUE&gt;&lt;/TVALUE&gt;&lt;/TVALUE&gt;&lt;/TVALUE&gt;&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
After learning to manipulate lambda expressions in this way I decided it would be&#xD;
a good idea to use a similar approach to remove the need for string literals in an&#xD;
INotifyPropertyChanged implementation. Unfortunately, while I was offline for a few&#xD;
days, &lt;a href="http://www.paulstovell.com/blog/strongly-typed-property-names"&gt;Paul&#xD;
got a head start&lt;/a&gt;.&#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://www.codeassassin.com/blog/aggbug.ashx?id=c02c0178-ca6c-4714-bd2b-ebd2d0ac2a4b"&gt;&lt;/img&gt;&#xD;
      &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/CodeAssassin?a=zbRyiH"&gt;&lt;img src="http://feeds.feedburner.com/~f/CodeAssassin?i=zbRyiH" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CodeAssassin?a=uLBkiH"&gt;&lt;img src="http://feeds.feedburner.com/~f/CodeAssassin?i=uLBkiH" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CodeAssassin?a=8UVqgh"&gt;&lt;img src="http://feeds.feedburner.com/~f/CodeAssassin?i=8UVqgh" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CodeAssassin?a=my8PRh"&gt;&lt;img src="http://feeds.feedburner.com/~f/CodeAssassin?i=my8PRh" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CodeAssassin?a=446TQH"&gt;&lt;img src="http://feeds.feedburner.com/~f/CodeAssassin?i=446TQH" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodeAssassin/~4/297053374" height="1" width="1"/&gt;</description>
      <comments>http://www.codeassassin.com/blog/CommentView,guid,c02c0178-ca6c-4714-bd2b-ebd2d0ac2a4b.aspx</comments>
      <category>.NET Framework</category>
    </item>
    <item>
      <trackback:ping>http://www.codeassassin.com/blog/Trackback.aspx?guid=bdbd2b90-413c-48b5-98e3-ec3cccb3868c</trackback:ping>
      <pingback:server>http://www.codeassassin.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.codeassassin.com/blog/PermaLink,guid,bdbd2b90-413c-48b5-98e3-ec3cccb3868c.aspx</pingback:target>
      <dc:creator>Jason</dc:creator>
      <wfw:comment>http://www.codeassassin.com/blog/CommentView,guid,bdbd2b90-413c-48b5-98e3-ec3cccb3868c.aspx</wfw:comment>
      <wfw:commentRss>http://www.codeassassin.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=bdbd2b90-413c-48b5-98e3-ec3cccb3868c</wfw:commentRss>
      <slash:comments>1</slash:comments>
      
      <title>Adelaide Geek Dinner May 2008</title>
      <guid isPermaLink="false">http://www.codeassassin.com/blog/PermaLink,guid,bdbd2b90-413c-48b5-98e3-ec3cccb3868c.aspx</guid>
      <link>http://www.codeassassin.com/blog/PermaLink,guid,bdbd2b90-413c-48b5-98e3-ec3cccb3868c.aspx</link>
      <pubDate>Sun, 27 Apr 2008 10:47:06 GMT</pubDate>
      <description>&lt;p&gt;&#xD;
After the success of the &lt;a href="http://www.codeassassin.com/blog/PermaLink,guid,3d03ace8-1a30-4437-9152-275d08d7e7d3.aspx"&gt;local&#xD;
geek dinner in early February&lt;/a&gt;, I intended to organise another one in late March&#xD;
but I became a little overwhelmed at home and work and completely forgot to organise&#xD;
it. My apologies to those who had been looking forward to it.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
However, I am now officially organising another dinner for Saturday May 17th. Instead&#xD;
of the usual location (where customer satisfaction has taken a turn for me) I will&#xD;
be relocating the dinner to another restaurant. I will strive to choose a replacement&#xD;
that is still located centrally, has good parking and public transport access, and&#xD;
affordable, enjoyable food with the option to split the bill.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
At this point I'm considering &lt;a href="http://www.cafeamore.com.au/" target="_blank"&gt;Caffe&#xD;
Amore&lt;/a&gt; on the corner of Pulteney and Pirie Streets in the CBD, about 400m from&#xD;
the previous venue. I enjoyed dinner there with friends a few weeks ago and was quite&#xD;
pleased with their food and service. Assuming I can book a table there for all the&#xD;
guests and no one suggests a better alternative, this will probably be the new venue.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
I will be sending an email invitation to all the previous dinner guests but if you&#xD;
don't receive yours before May or haven't attended before and would like to join us,&#xD;
please don't hesitate to contact me as soon as possible so I can give the restaurant&#xD;
an accurate number of guests to expect.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
I hope to see a few people who made it to &lt;a href="http://www.codecampoz.com/" target="_blank"&gt;Code&#xD;
Camp Oz&lt;/a&gt; this year. I was unfortunately double-booked and unable to attend and&#xD;
would like to hear all about it.&#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://www.codeassassin.com/blog/aggbug.ashx?id=bdbd2b90-413c-48b5-98e3-ec3cccb3868c"&gt;&lt;/img&gt;&#xD;
      &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/CodeAssassin?a=ZnN4TG"&gt;&lt;img src="http://feeds.feedburner.com/~f/CodeAssassin?i=ZnN4TG" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CodeAssassin?a=XkbcfG"&gt;&lt;img src="http://feeds.feedburner.com/~f/CodeAssassin?i=XkbcfG" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CodeAssassin?a=V7vPyg"&gt;&lt;img src="http://feeds.feedburner.com/~f/CodeAssassin?i=V7vPyg" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CodeAssassin?a=zBLd0g"&gt;&lt;img src="http://feeds.feedburner.com/~f/CodeAssassin?i=zBLd0g" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CodeAssassin?a=RXz1CG"&gt;&lt;img src="http://feeds.feedburner.com/~f/CodeAssassin?i=RXz1CG" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodeAssassin/~4/278743374" height="1" width="1"/&gt;</description>
      <comments>http://www.codeassassin.com/blog/CommentView,guid,bdbd2b90-413c-48b5-98e3-ec3cccb3868c.aspx</comments>
      <category>Geek Dinner;Local</category>
    </item>
    <item>
      <trackback:ping>http://www.codeassassin.com/blog/Trackback.aspx?guid=86b58275-bb7d-41a0-9938-e5f29a4ba30b</trackback:ping>
      <pingback:server>http://www.codeassassin.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.codeassassin.com/blog/PermaLink,guid,86b58275-bb7d-41a0-9938-e5f29a4ba30b.aspx</pingback:target>
      <dc:creator>Jason</dc:creator>
      <wfw:comment>http://www.codeassassin.com/blog/CommentView,guid,86b58275-bb7d-41a0-9938-e5f29a4ba30b.aspx</wfw:comment>
      <wfw:commentRss>http://www.codeassassin.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=86b58275-bb7d-41a0-9938-e5f29a4ba30b</wfw:commentRss>
      
      <title>TFPT TreeClean tamed with PowerShell</title>
      <guid isPermaLink="false">http://www.codeassassin.com/blog/PermaLink,guid,86b58275-bb7d-41a0-9938-e5f29a4ba30b.aspx</guid>
      <link>http://www.codeassassin.com/blog/PermaLink,guid,86b58275-bb7d-41a0-9938-e5f29a4ba30b.aspx</link>
      <pubDate>Sun, 13 Apr 2008 11:52:04 GMT</pubDate>
      <description>&lt;p&gt;&#xD;
          &lt;font color="#ff0000"&gt;&#xD;
            &lt;b&gt;Update:&lt;/b&gt;&#xD;
          &lt;/font&gt;&#xD;
          &lt;a href="http://forums.microsoft.com/msdn/User/Profile.aspx?UserID=833470&amp;amp;SiteID=1"&gt;Philip&#xD;
Kelley&lt;/a&gt; from Microsoft, &lt;a href="https://blogs.msdn.com/buckh/archive/2007/01/10/five-things-about-me.aspx"&gt;creator&#xD;
of TFPT&lt;/a&gt;, has kindly informed me that the July 2008 release of the TFS Power Tools&#xD;
is &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=00803636-1d16-4df1-8a3d-ef1ad4f4bbab&amp;amp;displaylang=en"&gt;now&#xD;
available for download&lt;/a&gt;. This new version includes enhancements to TFPT TreeClean&#xD;
that allow you to specify which files to include or exclude and as such solves the&#xD;
main problem my TreeClean PowerShell script was created for. The output format of&#xD;
the new TreeClean also renders this script incompatible but the general concepts used&#xD;
by the script may still be useful.&lt;br&gt;&lt;/p&gt;&#xD;
        &lt;hr size="2" width="100%"&gt;&lt;/hr&gt;&#xD;
        &lt;p&gt;&#xD;
I like the Team Foundation Server 2008 Power Tools, there are some great additions&#xD;
in there. One particular utility, TreeClean, has a great concept but is a little overzealous&#xD;
for my tastes.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The purpose of TreeClean is to find all local files in your workspace folders that&#xD;
do not exist in source control and then allow you to delete all of them. The problem&#xD;
is that it includes *.user files in its find results and the delete option is all&#xD;
or nothing. The list of files can also be rather overwhelming.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Thankfully we can get some more control by piping the results through PowerShell,&#xD;
starting with a simple script like this:&#xD;
&lt;/p&gt;&#xD;
        &lt;p class="code"&gt;&#xD;
$ProgFiles = $Env:ProgramFiles ;&lt;br&gt;&#xD;
$ProgFiles32 = (Get-Item "Env:ProgramFiles(x86)").Value ;&lt;br&gt;&#xD;
if (-not [String]::IsNullOrEmpty($ProgFiles32)) { $ProgFiles = $ProgFiles32 ; } &#xD;
&lt;/p&gt;&#xD;
        &lt;p class="code"&gt;&#xD;
$TFPTEXE = Join-Path -Path $ProgFiles `&lt;br&gt;&#xD;
    -ChildPath "Microsoft Team Foundation Server 2008 Power Tools\TFPT.exe"&#xD;
;&lt;br&gt;&#xD;
if (-not (Test-Path -Path $TFPTEXE)) { throw "TFPT.EXE not found." ; } &#xD;
&lt;/p&gt;&#xD;
        &lt;p class="code"&gt;&#xD;
[string]$Root = Resolve-Path -Path (Get-Location) ; &#xD;
&lt;/p&gt;&#xD;
        &lt;p class="code"&gt;&#xD;
&amp;amp; $TFPTEXE treeclean `&lt;br&gt;&#xD;
    | Where-Object { $_ -like ($Root + "*") } `&lt;br&gt;&#xD;
    | Get-Item -Force ; &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Once we have this script saved we can get more information from the results. For example,&#xD;
we can get count and list rogue files by extension:&#xD;
&lt;/p&gt;&#xD;
        &lt;p class="code"&gt;&#xD;
TreeClean.ps1 | group Extension&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
We can exclude directories:&#xD;
&lt;/p&gt;&#xD;
        &lt;p class="code"&gt;&#xD;
TreeClean.ps1 | ? { -not $_.PSIsContainer }&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
And finally we can delete everything but *.user files:&#xD;
&lt;/p&gt;&#xD;
        &lt;p class="code"&gt;&#xD;
TreeClean.ps1 | ? { $_.Extension -ne ".user" } | Remove-Item&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Now I can clean all the junk from my workspace but keep all my user-level project&#xD;
settings. However, while sorting through the extension-grouped report, looking for&#xD;
files to check-in before cleaning, there was a lot of noise from the build outputs.&#xD;
My quick solution:&#xD;
&lt;/p&gt;&#xD;
        &lt;p class="code"&gt;&#xD;
gci -inc *.sln -rec | % { MSBuild /t:Clean $_ }&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
It also has the nice side effect of significantly reducing your workspace folder size&#xD;
if you want to zip it up and send it somewhere.&#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://www.codeassassin.com/blog/aggbug.ashx?id=86b58275-bb7d-41a0-9938-e5f29a4ba30b"&gt;&lt;/img&gt;&#xD;
      &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/CodeAssassin?a=2sCkSLG"&gt;&lt;img src="http://feeds.feedburner.com/~f/CodeAssassin?i=2sCkSLG" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CodeAssassin?a=yuB4dtG"&gt;&lt;img src="http://feeds.feedburner.com/~f/CodeAssassin?i=yuB4dtG" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CodeAssassin?a=schlXng"&gt;&lt;img src="http://feeds.feedburner.com/~f/CodeAssassin?i=schlXng" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CodeAssassin?a=EtAr3dg"&gt;&lt;img src="http://feeds.feedburner.com/~f/CodeAssassin?i=EtAr3dg" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CodeAssassin?a=po1nDZG"&gt;&lt;img src="http://feeds.feedburner.com/~f/CodeAssassin?i=po1nDZG" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodeAssassin/~4/269422212" height="1" width="1"/&gt;</description>
      <comments>http://www.codeassassin.com/blog/CommentView,guid,86b58275-bb7d-41a0-9938-e5f29a4ba30b.aspx</comments>
      <category>PowerShell;Team Foundation Server</category>
    </item>
    <item>
      <trackback:ping>http://www.codeassassin.com/blog/Trackback.aspx?guid=3da6b3fb-50a5-4665-ba24-fe2204428d92</trackback:ping>
      <pingback:server>http://www.codeassassin.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.codeassassin.com/blog/PermaLink,guid,3da6b3fb-50a5-4665-ba24-fe2204428d92.aspx</pingback:target>
      <dc:creator>Jason</dc:creator>
      <wfw:comment>http://www.codeassassin.com/blog/CommentView,guid,3da6b3fb-50a5-4665-ba24-fe2204428d92.aspx</wfw:comment>
      <wfw:commentRss>http://www.codeassassin.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=3da6b3fb-50a5-4665-ba24-fe2204428d92</wfw:commentRss>
      
      <title>The Next Step For VS2008 Database Edition</title>
      <guid isPermaLink="false">http://www.codeassassin.com/blog/PermaLink,guid,3da6b3fb-50a5-4665-ba24-fe2204428d92.aspx</guid>
      <link>http://www.codeassassin.com/blog/PermaLink,guid,3da6b3fb-50a5-4665-ba24-fe2204428d92.aspx</link>
      <pubDate>Fri, 11 Apr 2008 13:49:51 GMT</pubDate>
      <description>&lt;p&gt;&#xD;
I started using &lt;a href="http://msdn2.microsoft.com/en-au/vsts2008/products/bb933747.aspx" target="_blank"&gt;VSTS&#xD;
Database Edition&lt;/a&gt; back when it was called Data Dude and available as a CTP download.&#xD;
Since then I have slowly embraced all its features and I now use it as my complete&#xD;
database development solution from schema management, to data generation, and finally&#xD;
deployment.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
DB Edition has its quirks but you learn to understand them and work with them and&#xD;
each new version has new features to improve the workflow. However, as I have been&#xD;
using DB Edition each day, an idea has been steadily stewing in my head for where&#xD;
I'd like to see DB Edition go next. My thought process in a nut-shell follows...&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
A Database Project allows you to define your schema and data generation and, from&#xD;
a Visual Studio context menu, deploy the database to a chosen server as a new database&#xD;
or as an upgrade to an existing database. You can also use the &lt;a href="http://msdn2.microsoft.com/en-us/library/microsoft.visualstudio.teamsystem.data.unittesting.databasetestservice.aspx" target="_blank"&gt;DatabaseTestService&lt;/a&gt; in&#xD;
a test project to deploy the database and test data for automated testing. And finally&#xD;
you can use the SqlDeploy MSBuild task to deploy the database as part of a continuous&#xD;
integration build. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
However, all of these methods of deployment require the relative path to the Database&#xD;
Project and all its SQL scripts and some settings in a configuration file. This causes&#xD;
problems in deployed test runs and Team Build test runs where the relative path to&#xD;
Database Project often changes. It also restricts using multiple test databases in&#xD;
a single test project due to the way the configuration file works.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
I propose that, at build time, DB Edition could package into a .NET assembly, the&#xD;
full definition of the Database Project along with some standard bootstrap code but&#xD;
minus the deployment configuration. Test projects could then include a reference to&#xD;
the DB assembly and make calls into the bootstrap code, perhaps something in the form:&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
MyDBAssembly.Schema.DeployTo(someConnectionString, someOptions); &#xD;
&lt;br&gt;&#xD;
MyDBAssembly.SomeDataGenPlan.DeployTo(someConnectionString); &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The DB assembly will be treated as a dependency like any other references would and&#xD;
will naturally be moved around wherever the primary assembly gets deployed and all&#xD;
the necessary information will always be available to perform a completely new database&#xD;
deployment or to perform a schema upgrade on any compatible existing database instance. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
If the DB assembly happened to double as a console application, it could be used for&#xD;
ad hoc command-line deployments or even included in batch, MSBuild, or PowerShell&#xD;
scripts for automated deployments.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
I am contemplating several ways to hack a feature like this into DB Edition myself&#xD;
but I'm hoping someone else has already done it or maybe the &lt;a href="http://blogs.msdn.com/gertd/" target="_blank"&gt;DB&#xD;
Edition team&lt;/a&gt; already has it on the cards for Rosario.&#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://www.codeassassin.com/blog/aggbug.ashx?id=3da6b3fb-50a5-4665-ba24-fe2204428d92"&gt;&lt;/img&gt;&#xD;
      &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/CodeAssassin?a=zIkAxZG"&gt;&lt;img src="http://feeds.feedburner.com/~f/CodeAssassin?i=zIkAxZG" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CodeAssassin?a=P5rUvDG"&gt;&lt;img src="http://feeds.feedburner.com/~f/CodeAssassin?i=P5rUvDG" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CodeAssassin?a=mrMZIXg"&gt;&lt;img src="http://feeds.feedburner.com/~f/CodeAssassin?i=mrMZIXg" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CodeAssassin?a=vawHHsg"&gt;&lt;img src="http://feeds.feedburner.com/~f/CodeAssassin?i=vawHHsg" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CodeAssassin?a=WOCkNAG"&gt;&lt;img src="http://feeds.feedburner.com/~f/CodeAssassin?i=WOCkNAG" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodeAssassin/~4/268382134" height="1" width="1"/&gt;</description>
      <comments>http://www.codeassassin.com/blog/CommentView,guid,3da6b3fb-50a5-4665-ba24-fe2204428d92.aspx</comments>
      <category>SQL Server;Visual Studio</category>
    </item>
    <item>
      <trackback:ping>http://www.codeassassin.com/blog/Trackback.aspx?guid=38d96fb9-0699-46a6-b998-4d5ec2acc0c4</trackback:ping>
      <pingback:server>http://www.codeassassin.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.codeassassin.com/blog/PermaLink,guid,38d96fb9-0699-46a6-b998-4d5ec2acc0c4.aspx</pingback:target>
      <dc:creator>Jason</dc:creator>
      <wfw:comment>http://www.codeassassin.com/blog/CommentView,guid,38d96fb9-0699-46a6-b998-4d5ec2acc0c4.aspx</wfw:comment>
      <wfw:commentRss>http://www.codeassassin.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=38d96fb9-0699-46a6-b998-4d5ec2acc0c4</wfw:commentRss>
      
      <title>Custom TFS Check In Policy Responsiveness</title>
      <guid isPermaLink="false">http://www.codeassassin.com/blog/PermaLink,guid,38d96fb9-0699-46a6-b998-4d5ec2acc0c4.aspx</guid>
      <link>http://www.codeassassin.com/blog/PermaLink,guid,38d96fb9-0699-46a6-b998-4d5ec2acc0c4.aspx</link>
      <pubDate>Wed, 09 Apr 2008 12:25:22 GMT</pubDate>
      <description>&lt;p&gt;&#xD;
I've used several third party Check In Policies for Team Foundation Server with both&#xD;
TFS2005 and 2008 and I've dabbled in writing my own too. One thing I noticed with&#xD;
most of them, is that they don't appear to respond to actions in the VS Pending Changes&#xD;
window as readily as the standard Microsoft policies.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
I recently followed &lt;a href="http://www.nervoustych.com/" target="_blank"&gt;Jim's&lt;/a&gt; example &lt;a href="http://www.nervoustych.com/blog/PermaLink,guid,1bafb31c-3f16-497d-ac99-46e41fa51348.aspx" target="_blank"&gt;Option&#xD;
Strict Check In Policy&lt;/a&gt; to write my own policy to prevent checking in code with&#xD;
the &lt;a href="http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=311689" target="_blank"&gt;DataSet&#xD;
Designer ConnectionState Bug&lt;/a&gt;. The policy would always correctly evaluate when&#xD;
clicking the Check In button but the Policy Warnings tab didn't always update automatically&#xD;
when Source Files list changed.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
I decided it was time to dig deeper and find out why the standard policies work nicely&#xD;
when compared to the custom ones. After a few minutes with Reflector I discovered&#xD;
there were a few more things to do beyond the &lt;a href="http://msdn2.microsoft.com/en-us/library/bb668980.aspx" target="_blank"&gt;instructions&#xD;
in the MSDN article&lt;/a&gt; to create a responsive custom policy.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The &lt;a href="http://msdn2.microsoft.com/en-us/library/microsoft.teamfoundation.versioncontrol.client.policybase.aspx" target="_blank"&gt;PolicyBase&#xD;
class&lt;/a&gt;, from which your custom policy should inherit, gets passed an instance of &lt;a href="http://msdn2.microsoft.com/en-us/library/microsoft.teamfoundation.versioncontrol.client.ipendingcheckin.aspx" target="_blank"&gt;IPendingCheckin&lt;/a&gt; to&#xD;
its &lt;a href="http://msdn2.microsoft.com/en-us/library/microsoft.teamfoundation.versioncontrol.client.policybase.initialize.aspx" target="_blank"&gt;Initialize&lt;/a&gt; method&#xD;
which it persists and is made available to your subclass via a protected &lt;a href="http://msdn2.microsoft.com/en-us/library/microsoft.teamfoundation.versioncontrol.client.policybase.pendingcheckin.aspx" target="_blank"&gt;PendingCheckin&lt;/a&gt; property.&#xD;
The IPendingCheckin instance exposes several other objects with events that you can&#xD;
handle to be notified when changes relevant to your policy occur.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The methodology that worked for me was to override Initialize and register the event&#xD;
handler and override Dispose also to remove the handler at the end. All the handler&#xD;
does, after checking the base class isn't disposed, is to call the custom policy's&#xD;
Evaluate function and raise the base's &lt;a href="http://msdn2.microsoft.com/en-us/library/microsoft.teamfoundation.versioncontrol.client.policybase.policystatechanged.aspx" target="_blank"&gt;PolicyStateChanged&lt;/a&gt; event. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Sample code for a policy dependent on the Source Files list, like the Option Strict&#xD;
policy and the ConnectionState Bug policy, follows:&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&#xD;
            &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;Public&lt;/span&gt;&#xD;
            &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;Overrides&lt;/span&gt;&#xD;
            &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;Sub&lt;/span&gt; Initialize(&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;ByVal&lt;/span&gt; pendingCheckin &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;As&lt;/span&gt; IPendingCheckin)&lt;br&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;   &#xD;
MyBase&lt;/span&gt;.Initialize(pendingCheckin)&lt;br&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;   &#xD;
AddHandler&lt;/span&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;MyBase&lt;/span&gt;.PendingCheckin.PendingChanges.CheckedPendingChangesChanged,&#xD;
_&lt;br&gt;&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;        &lt;font color="#0000ff"&gt;AddressOf&lt;/font&gt;&lt;/span&gt; CheckedPendingChangesChanged&lt;br&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;End&lt;/span&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;Sub&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;Private&lt;/span&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;Sub&lt;/span&gt; CheckedPendingChangesChanged(&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;ByVal&lt;/span&gt; sender &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;As&lt;/span&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;Object&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;ByVal&lt;/span&gt; e &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;As&lt;/span&gt; EventArgs)&lt;br&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;   &#xD;
If&lt;/span&gt;&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;font color="#0000ff"&gt;Not&lt;/font&gt;&lt;/span&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;MyBase&lt;/span&gt;.Disposed &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;Then&lt;/span&gt;&lt;br&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;       &#xD;
Dim&lt;/span&gt; failures &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;font color="#000000"&gt;=&lt;/font&gt;&lt;/span&gt; Evaluate()&lt;br&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;       &#xD;
MyBase&lt;/span&gt;.OnPolicyStateChanged(failures)&lt;br&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;    End&lt;/span&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;If&lt;/span&gt;&lt;br&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;End&lt;/span&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;Sub&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;Public&lt;/span&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;Overrides&lt;/span&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;Sub&lt;/span&gt; Dispose()&lt;br&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;   &#xD;
RemoveHandler&lt;/span&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;MyBase&lt;/span&gt;.PendingCheckin.PendingChanges.CheckedPendingChangesChanged,&#xD;
_&lt;br&gt;&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;        &lt;font color="#0000ff"&gt;AddressOf&lt;/font&gt;&lt;/span&gt; CheckedPendingChangesChanged&lt;br&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;   &#xD;
MyBase&lt;/span&gt;.Dispose()&lt;br&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;End&lt;/span&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;Sub&lt;/span&gt;&lt;/span&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://www.codeassassin.com/blog/aggbug.ashx?id=38d96fb9-0699-46a6-b998-4d5ec2acc0c4"&gt;&lt;/img&gt;&#xD;
      &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/CodeAssassin?a=23tkTyG"&gt;&lt;img src="http://feeds.feedburner.com/~f/CodeAssassin?i=23tkTyG" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CodeAssassin?a=ALTBjbG"&gt;&lt;img src="http://feeds.feedburner.com/~f/CodeAssassin?i=ALTBjbG" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CodeAssassin?a=eVMGxcg"&gt;&lt;img src="http://feeds.feedburner.com/~f/CodeAssassin?i=eVMGxcg" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CodeAssassin?a=CKX437g"&gt;&lt;img src="http://feeds.feedburner.com/~f/CodeAssassin?i=CKX437g" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CodeAssassin?a=K8YmFJG"&gt;&lt;img src="http://feeds.feedburner.com/~f/CodeAssassin?i=K8YmFJG" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodeAssassin/~4/266986682" height="1" width="1"/&gt;</description>
      <comments>http://www.codeassassin.com/blog/CommentView,guid,38d96fb9-0699-46a6-b998-4d5ec2acc0c4.aspx</comments>
      <category>Team Foundation Server</category>
    </item>
    <item>
      <trackback:ping>http://www.codeassassin.com/blog/Trackback.aspx?guid=83b382a4-c3c6-4ef3-870d-86bba6ba34c4</trackback:ping>
      <pingback:server>http://www.codeassassin.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.codeassassin.com/blog/PermaLink,guid,83b382a4-c3c6-4ef3-870d-86bba6ba34c4.aspx</pingback:target>
      <dc:creator>Jason</dc:creator>
      <wfw:comment>http://www.codeassassin.com/blog/CommentView,guid,83b382a4-c3c6-4ef3-870d-86bba6ba34c4.aspx</wfw:comment>
      <wfw:commentRss>http://www.codeassassin.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=83b382a4-c3c6-4ef3-870d-86bba6ba34c4</wfw:commentRss>
      <slash:comments>1</slash:comments>
      
      <title>FxCop Now Targeting Speeding</title>
      <guid isPermaLink="false">http://www.codeassassin.com/blog/PermaLink,guid,83b382a4-c3c6-4ef3-870d-86bba6ba34c4.aspx</guid>
      <link>http://www.codeassassin.com/blog/PermaLink,guid,83b382a4-c3c6-4ef3-870d-86bba6ba34c4.aspx</link>
      <pubDate>Mon, 31 Mar 2008 23:39:34 GMT</pubDate>
      <description>&lt;p&gt;&#xD;
Almost two months ago, at the &lt;a href="http://www.codeassassin.com/blog/PermaLink,guid,3d03ace8-1a30-4437-9152-275d08d7e7d3.aspx" target="_blank"&gt;February&#xD;
Adelaide Geek Dinner&lt;/a&gt;, I was expressing my frustration at one of my Visual Studio&#xD;
solutions taking too long to build and how I would like Visual Studio to build using&#xD;
multiple processors just like the new &lt;a href="http://msdn2.microsoft.com/en-us/library/bb651793.aspx" target="_blank"&gt;MSBuild&#xD;
/m parameter&lt;/a&gt;.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://www.paulstovell.com/blog/" target="_blank"&gt;Paul Stovell&lt;/a&gt; made the&#xD;
comment that even with the improvement that multi-core builds was giving me, my solution&#xD;
really shouldn't be taking that long to build. Given that Paul wasn't familiar with&#xD;
my particular project layout and I naturally didn't have a copy with me, the conversation&#xD;
quickly went onto other topics.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
However, Paul's comment stayed with me for days after, bugging me every time I waited&#xD;
for the latest build to complete. Then, while staring at the VS Output window during&#xD;
a build, I noticed that most of the time seemed to be spent running FxCop on each&#xD;
project.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
I decided to rebuild the solution but this time disabling code analysis via the appropriate&#xD;
build switch. I watched the build time drop from 40 seconds to just 10 seconds by&#xD;
skipping the FxCop process.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Excellent! But given that our entire team runs with &lt;a href="http://msdn2.microsoft.com/en-us/library/zcd4xwzs.aspx" target="_blank"&gt;Option&#xD;
Strict On&lt;/a&gt;, &lt;a href="http://msdn2.microsoft.com/en-us/library/406xhdz3.aspx" target="_blank"&gt;Treat&#xD;
Warnings As Errors&lt;/a&gt;, and the &lt;a href="http://msdn2.microsoft.com/en-us/library/ms182075.aspx" target="_blank"&gt;Code&#xD;
Analysis Check-in Policy&lt;/a&gt;, how could I possibly revert to such a lax build process&#xD;
for the sake of decreased build time?&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The answer is to disable Code Analysis in each project's settings (and unfortunately&#xD;
the check-in policy too) but leave it enabled in the Team Build script so it runs&#xD;
and gets reported via the continuous integration build that runs after each check-in.&#xD;
Luckily we've also been running with FxCop for so long that we tend to avoid writing&#xD;
code that would cause violations in the first place.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
I met with Paul over the weekend and mentioned my success with better build times.&#xD;
When I told him I had been running FxCop with every build, he just laughed, amazed.&#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://www.codeassassin.com/blog/aggbug.ashx?id=83b382a4-c3c6-4ef3-870d-86bba6ba34c4"&gt;&lt;/img&gt;&#xD;
      &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/CodeAssassin?a=yHOgCEF"&gt;&lt;img src="http://feeds.feedburner.com/~f/CodeAssassin?i=yHOgCEF" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CodeAssassin?a=XJ2xpRF"&gt;&lt;img src="http://feeds.feedburner.com/~f/CodeAssassin?i=XJ2xpRF" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CodeAssassin?a=6Zrf6gf"&gt;&lt;img src="http://feeds.feedburner.com/~f/CodeAssassin?i=6Zrf6gf" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CodeAssassin?a=Fu0399f"&gt;&lt;img src="http://feeds.feedburner.com/~f/CodeAssassin?i=Fu0399f" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/CodeAssassin?a=kW85lwF"&gt;&lt;img src="http://feeds.feedburner.com/~f/CodeAssassin?i=kW85lwF" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodeAssassin/~4/261598888" height="1" width="1"/&gt;</description>
      <comments>http://www.codeassassin.com/blog/CommentView,guid,83b382a4-c3c6-4ef3-870d-86bba6ba34c4.aspx</comments>
      <category>Visual Studio</category>
    </item>
  </channel>
</rss>
