<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://devlicio.us/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Lazy Developer : Tools</title><link>http://devlicio.us/blogs/ziemowit_skowronski/archive/tags/Tools/default.aspx</link><description>Tags: Tools</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP1 (Build: 31106.3070)</generator><item><title>Debugging Assembly Loading Errors</title><link>http://devlicio.us/blogs/ziemowit_skowronski/archive/2007/06/28/debugging-assembly-loading-errors.aspx</link><pubDate>Thu, 28 Jun 2007 16:27:00 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:30745</guid><dc:creator>Jimmy</dc:creator><slash:comments>5</slash:comments><description>
&lt;p&gt;There are situations sometimes when .NET loads wrong assembly or can't load one at all. Usually we can see TypeLoadException in that case. Assuming we have exception at all.  
&lt;/p&gt;

&lt;p&gt;One of my work colleagues had situation today that gave a real world example for post I was thinking about quite long time. There was a test class in a project and everything worked fine till he made one very small change in one of test fixtures. When he ran NUnit again he noticed that there is still old version of the assembly. Quick look into Reflector gave expected results; assembly was well compiled and contains new method as expected. However, NUnit was still stubborn. There can be many situations like that, when in our opinion all is perfect but isn't and .NET fails with loading assembly or loads incorrect one.
&lt;/p&gt;

&lt;p&gt;To diagnose that problem we will use Assembly Binding Log. If you will take a look into .NET Framework directory you will see a fusion.dll. This inconspicuous file is responsible for finding locating the correct assembly and, what is more important, can produce a log of that. As a pair for that we have simple tool named fuslogvw.exe that can be found in Visual Studio directory. This small tool is an Assembly Binding Log Viewer and is able to get logs created by fusion.dll, save them on disk and of course display.
&lt;/p&gt;

&lt;p&gt;The easiest way to run it is to start Visual Studio Command Prompt and type fuslogvw but be careful. In Visual Studio .NET 2003 is older version that works with .NET 1.x while VS 2005 and Orcas have newer version that works with .NET 2.0.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://devlicio.us/photos/devlicious/picture30742.aspx" target="_blank"&gt;&lt;img src="http://devlicio.us/photos/devlicious/images/30742/425x413.aspx" border="0"&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;To be able to get log we have to configure fusion to create log files for us. Click on Settings opens small configuration window. &lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;a href="http://devlicio.us/photos/devlicious/picture30743.aspx" target="_blank"&gt;&lt;img src="http://devlicio.us/photos/devlicious/images/30743/original.aspx" border="0"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By default log is disabled. We can turn on logging for specific situations such as binding failures or just log everything. Good practice is here to set up log to custom path. If we are dealing with TypeLoadException or similar problems we can just log failures. However is you know, as we knew, the something is wrong but you don't have exception turn on logging for all bindings. Now you can run code/program that causes the problem and click Refresh when it will finish. You should see something like on screen below.&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;a href="http://devlicio.us/photos/devlicious/picture30744.aspx" target="_blank"&gt;&lt;img src="http://devlicio.us/photos/devlicious/images/30744/425x217.aspx" border="0"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Double click on any log entry will open whole log for that assembly. Information you can find there is sometimes amazing. There is example for loading nunit.framework I made during writing that post.
&lt;/p&gt;

&lt;textarea class="xml" name="code" rows="10" cols="80"&gt;*** Assembly Binder Log Entry  (28/06/2007 @ 17:18:41) ***
The operation was successful.
Bind result: hr = 0x0. The operation completed successfully.
Assembly manager loaded from:  C:\Windows\Microsoft.NET\Framework\v1.1.4322\fusion.dll
Running under executable  c:\windows\system32\inetsrv\w3wp.exe
--- A detailed error log follows. 
=== Pre-bind state information ===
LOG: DisplayName = nunit.framework
 (Partial)
LOG: Appbase = file:///D:/Projects/project/1.0/UI/API
LOG: Initial PrivatePath = bin
LOG: Dynamic Base = C:\Windows\Microsoft.Net\Framework\v1.1.4322\Temporary ASP.NET Files\project\653d78d0
LOG: Cache Base = C:\Windows\Microsoft.Net\Framework\v1.1.4322\Temporary ASP.NET Files\project\653d78d0
LOG: AppName = 15ce7b31
Calling assembly : (Unknown).
===
LOG: Processing DEVPATH.
LOG: DEVPATH is not set. Falling through to regular bind.
LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind).
LOG: Post-policy reference: nunit.framework
LOG: Attempting download of new URL file:///C:/Windows/Microsoft.Net/Framework/v1.1.4322/Temporary ASP.NET Files/project/653d78d0/15ce7b31/nunit.framework.DLL.
LOG: Attempting download of new URL file:///C:/Windows/Microsoft.Net/Framework/v1.1.4322/Temporary ASP.NET Files/project/653d78d0/15ce7b31/nunit.framework/nunit.framework.DLL.
LOG: Attempting download of new URL file:///D:/Projects/project/1.0/UI/API/bin/nunit.framework.DLL.
LOG: Assembly download was successful. Attempting setup of file: D:\Projects\project\1.0\UI\API\bin\nunit.framework.DLL
LOG: Entering download cache setup phase.
LOG: A partially-specified assembly bind succeeded from the application directory.
LOG: Publisher policy file is not found.
LOG: No redirect found in host configuration file (C:\Windows\Microsoft.NET\Framework\v1.1.4322\Aspnet.config).
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework\v1.1.4322\config\machine.config.
LOG: Post-policy reference: nunit.framework, Version=2.4.0.2, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77
LOG: Cache Lookup was unsuccessful.
&lt;/textarea&gt;

&lt;p&gt;&lt;br&gt;By analysing that information you should be able to find the problem. In our case it was ... shadow copy made by NUnit. From unknown reason NUnit didn't refresh his copy. And that was the proof:
&lt;/p&gt;

&lt;textarea class="xml" name="code" rows="10" cols="80"&gt;LOG: Binding succeeds. Returns assembly from C:\Documents and Settings\user \Local Settings\Temp\nunit20\ShadowCopyCache\5904_633186298018807081\Tests\assembly\dl3\2556089a\7cef037d_0cb8c701\mylibrary.dll.
&lt;/textarea&gt;

&lt;p&gt;Ah. Don't forget to turn logging of when you finish.&amp;nbsp;&lt;/p&gt;

&lt;p&gt;There is a lot of articles over the Internet about fusion and debugging problems with assembly loading, however this is kind of information that can be repeated over and over. To be honest I'm quite surprised why this is not as popular as I could expect. So if you already know all of that then congratulation but if you don't remember and use that. As my colleague said, "This is life saving tool".
&lt;/p&gt;

&lt;p&gt;HTH
&lt;/p&gt;

&lt;p&gt;J.&lt;/p&gt;
&lt;a href="http://www.dotnetkicks.com/kick/?url=http://devlicio.us/blogs/ziemowit_skowronski/archive/2007/06/28/debugging-assembly-loading-errors.aspx"&gt;&lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://devlicio.us/blogs/ziemowit_skowronski/archive/2007/06/28/debugging-assembly-loading-errors.aspx" alt="kick it on DotNetKicks.com" border="0"&gt;&lt;/a&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=30745" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/ziemowit_skowronski/archive/tags/Tools/default.aspx">Tools</category><category domain="http://devlicio.us/blogs/ziemowit_skowronski/archive/tags/.NET+2.0/default.aspx">.NET 2.0</category><category domain="http://devlicio.us/blogs/ziemowit_skowronski/archive/tags/Tips+_2600_amp_3B00_+Tricks/default.aspx">Tips &amp;amp; Tricks</category></item><item><title>Validation with Enterprise Library 3.x</title><link>http://devlicio.us/blogs/ziemowit_skowronski/archive/2007/06/26/validation-with-enterprise-library-3-x.aspx</link><pubDate>Tue, 26 Jun 2007 11:43:00 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:30375</guid><dc:creator>Jimmy</dc:creator><slash:comments>7</slash:comments><description>
&lt;p&gt;Usually object validation requires writing a lot of code that examines properties and returns validation result. With VAB this scenario becomes extremely easy and simple.
Let us consider sample class:&lt;/p&gt;
&lt;div style="background:white none repeat scroll 0% 50%;font-family:Consolas;font-size:8pt;color:black;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;
&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span&gt;User&lt;/span&gt;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2&lt;/span&gt;&amp;nbsp;{&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;3&lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; User()&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;4&lt;/span&gt;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;5&lt;/span&gt;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;6&lt;/span&gt;&amp;nbsp;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;7&lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; _firstName;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;8&lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; FirstName&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;9&lt;/span&gt;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;10&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;get&lt;/span&gt; { &lt;span style="color:blue;"&gt;return&lt;/span&gt; _firstName; }&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;11&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;set&lt;/span&gt; { _firstName = &lt;span style="color:blue;"&gt;value&lt;/span&gt;; }&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;12&lt;/span&gt;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;13&lt;/span&gt;&amp;nbsp;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;14&lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; _lastName;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;15&lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; LastName&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;16&lt;/span&gt;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;17&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;get&lt;/span&gt; { &lt;span style="color:blue;"&gt;return&lt;/span&gt; _lastName; }&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;18&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;set&lt;/span&gt; { _lastName = &lt;span style="color:blue;"&gt;value&lt;/span&gt;; }&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;19&lt;/span&gt;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;20&lt;/span&gt;&amp;nbsp;}&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;
Now let’s assume some validation rules we want to fill:
# First name is required
# Last name is required
# First name can’t be longer than 20 characters
To complete that task we probably would write something like this:&lt;/p&gt;
&lt;div style="background:white none repeat scroll 0% 50%;font-family:Consolas;font-size:8pt;color:black;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;
&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;gt; Validate()&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2&lt;/span&gt;&amp;nbsp;{&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;3&lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;gt; validationResults = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;gt;();&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;4&lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (&lt;span style="color:blue;"&gt;string&lt;/span&gt;.IsNullOrEmpty(FirstName))&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;5&lt;/span&gt;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;6&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; validationResults.Add(&lt;span&gt;"FirstName is required"&lt;/span&gt;);&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;7&lt;/span&gt;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;8&lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (!&lt;span style="color:blue;"&gt;string&lt;/span&gt;.IsNullOrEmpty(FirstName) &amp;amp;&amp;amp; FirstName.Length &amp;gt; 20)&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;9&lt;/span&gt;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;10&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; validationResults.Add(&lt;span&gt;"FirstName can not be longer than 20 characters"&lt;/span&gt;);&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;11&lt;/span&gt;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;12&lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (&lt;span style="color:blue;"&gt;string&lt;/span&gt;.IsNullOrEmpty(LastName))&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;13&lt;/span&gt;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;14&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; validationResults.Add(&lt;span&gt;"LastName is required"&lt;/span&gt;);&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;15&lt;/span&gt;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;16&lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (validationResults.Count &amp;gt; 0)&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;17&lt;/span&gt;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;18&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;return&lt;/span&gt; validationResults;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;19&lt;/span&gt;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;20&lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;else&lt;/span&gt;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;21&lt;/span&gt;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;22&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:blue;"&gt;null&lt;/span&gt;;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;23&lt;/span&gt;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;24&lt;/span&gt;&amp;nbsp;}&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;
And this is the code that validates the class.&lt;br&gt;&lt;/p&gt;
&lt;div style="background:white none repeat scroll 0% 50%;font-family:Consolas;font-size:8pt;color:black;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;
&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; Main(&lt;span style="color:blue;"&gt;string&lt;/span&gt;[] args)&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2&lt;/span&gt;&amp;nbsp;{&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;3&lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span&gt;User&lt;/span&gt; myUser = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span&gt;User&lt;/span&gt;();&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;4&lt;/span&gt;&amp;nbsp;&amp;nbsp; myUser.FirstName = &lt;span&gt;"Very very long first name"&lt;/span&gt;;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;5&lt;/span&gt;&amp;nbsp;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;6&lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;gt; validationResults = myUser.Validate();&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;7&lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (validationResults != &lt;span style="color:blue;"&gt;null&lt;/span&gt;)&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;8&lt;/span&gt;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;9&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span&gt;Console&lt;/span&gt;.WriteLine(&lt;span&gt;"Validation errors:"&lt;/span&gt;);&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;10&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color:blue;"&gt;string&lt;/span&gt; result &lt;span style="color:blue;"&gt;in&lt;/span&gt; validationResults)&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;11&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; {&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;12&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;Console&lt;/span&gt;.WriteLine(result);&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;13&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; }&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;14&lt;/span&gt;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;15&lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;else&lt;/span&gt;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;16&lt;/span&gt;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;17&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span&gt;Console&lt;/span&gt;.WriteLine(&lt;span&gt;"Validation ok!"&lt;/span&gt;);&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;18&lt;/span&gt;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;19&lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span&gt;Console&lt;/span&gt;.ReadLine();&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;20&lt;/span&gt;&amp;nbsp;}&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;
There is many ways to code validation so it can look very different for each of us. However one thing will remain less or more the same - property examination. This piece of code will grow with number of properties.
How VAB can help there. The best will be to take a look to code sample below. This code is doing the same validation as previous one.&lt;br&gt;&lt;/p&gt;
&lt;div style="background:white none repeat scroll 0% 50%;font-family:Consolas;font-size:8pt;color:black;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;
&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span&gt;User&lt;/span&gt;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2&lt;/span&gt;&amp;nbsp;{&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;3&lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; User()&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;4&lt;/span&gt;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;5&lt;/span&gt;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;6&lt;/span&gt;&amp;nbsp;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;7&lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; _firstName;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;8&lt;/span&gt;&amp;nbsp;&amp;nbsp; [&lt;span&gt;NotNullValidator&lt;/span&gt;(MessageTemplate=&lt;span&gt;"First Name is required"&lt;/span&gt;)]&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;9&lt;/span&gt;&amp;nbsp;&amp;nbsp; [&lt;span&gt;StringLengthValidator&lt;/span&gt;(1, 20, MessageTemplate=&lt;span&gt;"First name can not be longer that 50 characters"&lt;/span&gt;)]&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;10&lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; FirstName&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;11&lt;/span&gt;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;12&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;get&lt;/span&gt; { &lt;span style="color:blue;"&gt;return&lt;/span&gt; _firstName; }&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;13&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;set&lt;/span&gt; { _firstName = &lt;span style="color:blue;"&gt;value&lt;/span&gt;; }&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;14&lt;/span&gt;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;15&lt;/span&gt;&amp;nbsp;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;16&lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; _lastName;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;17&lt;/span&gt;&amp;nbsp;&amp;nbsp; [&lt;span&gt;NotNullValidator&lt;/span&gt;(MessageTemplate = &lt;span&gt;"First Name is required"&lt;/span&gt;)]&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;18&lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; LastName&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;19&lt;/span&gt;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;20&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;get&lt;/span&gt; { &lt;span style="color:blue;"&gt;return&lt;/span&gt; _lastName; }&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;21&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;set&lt;/span&gt; { _lastName = &lt;span style="color:blue;"&gt;value&lt;/span&gt;; }&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;22&lt;/span&gt;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;23&lt;/span&gt;&amp;nbsp;}&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;
That code requires reference to Microsoft.Practices.EnterpriseLibrary.Validation.dll and two extra lines on top:&lt;br&gt;&lt;/p&gt;
&lt;div style="background:white none repeat scroll 0% 50%;font-family:Consolas;font-size:8pt;color:black;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;
&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;using&lt;/span&gt; Microsoft.Practices.EnterpriseLibrary.Validation;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;using&lt;/span&gt; Microsoft.Practices.EnterpriseLibrary.Validation.Validators;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;
The consuming code will be almost the same as in previous case:&lt;br&gt;&lt;/p&gt;
&lt;div style="background:white none repeat scroll 0% 50%;font-family:Consolas;font-size:8pt;color:black;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;
&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; Main(&lt;span style="color:blue;"&gt;string&lt;/span&gt;[] args)&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2&lt;/span&gt;&amp;nbsp;{&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;3&lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span&gt;User&lt;/span&gt; myUser = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span&gt;User&lt;/span&gt;();&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;4&lt;/span&gt;&amp;nbsp;&amp;nbsp; myUser.FirstName = &lt;span&gt;"Very very long first name"&lt;/span&gt;;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;5&lt;/span&gt;&amp;nbsp;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;6&lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span&gt;ValidationResults&lt;/span&gt; results = &lt;span&gt;Validation&lt;/span&gt;.Validate&amp;lt;&lt;span&gt;User&lt;/span&gt;&amp;gt;(myUser);&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;7&lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (!results.IsValid)&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;8&lt;/span&gt;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;9&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span&gt;Console&lt;/span&gt;.WriteLine(&lt;span&gt;"Validation errors:"&lt;/span&gt;);&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;10&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;foreach&lt;/span&gt; (&lt;span&gt;ValidationResult&lt;/span&gt; result &lt;span style="color:blue;"&gt;in&lt;/span&gt; results)&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;11&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; {&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;12&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;Console&lt;/span&gt;.WriteLine(result.Message);&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;13&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; }&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;14&lt;/span&gt;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;15&lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;else&lt;/span&gt;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;16&lt;/span&gt;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;17&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span&gt;Console&lt;/span&gt;.WriteLine(&lt;span&gt;"Validation ok!"&lt;/span&gt;);&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;18&lt;/span&gt;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;19&lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span&gt;Console&lt;/span&gt;.ReadLine();&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;20&lt;/span&gt;&amp;nbsp;}&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;
I think that after that example all is clear, validation has been added to properties as attributes. VAB provides number of validation attributes. List of all of them is too long to put it there so let me list a few most popular:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ContainsCharactersValidator - Performs validation on strings by verifying if it contains a character set. 
&lt;/li&gt;
&lt;li&gt;DateTimeRangeValidator - Performs validation on DateTime instances by comparing them to the specified boundaries. 
&lt;/li&gt;
&lt;li&gt;NotNullValidator - Logs a failure when validating a nullNothingnullptr reference. &lt;/li&gt;
&lt;li&gt;RangeValidator - Performs validation on T instances by comparing them to the specified boundaries. 
&lt;/li&gt;
&lt;li&gt;RegexValidator - Performs validation on strings by matching them to a Regex. 
&lt;/li&gt;
&lt;li&gt;StringLengthValidator - Performs validation on strings by comparing their lengths to the specified boundaries. 
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And of course you can create your own validation method for some complex criteria and use that in the same way.&lt;/p&gt;
&lt;p&gt;Example I shown is very simple presentation of the idea behing validation in Enterprise Library implementation. How far this will go depend only on what wee need. Validation can be also connected with Policy Iniection Application Block but this is another topic.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://devlicio.us/blogs/michal_grzegorzewski/default.aspx"&gt;Michal Grzegorzewski&lt;/a&gt; is actually wrtiting a bigger article about Validation Application Block. Stay tuned and watch his &lt;a href="http://devlicio.us/blogs/michal_grzegorzewski/default.aspx"&gt;blog&lt;/a&gt; if you want a bit more details.&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Hope that help&lt;/p&gt;
&lt;a href="http://www.dotnetkicks.com/kick/?url=http://devlicio.us/blogs/ziemowit_skowronski/archive/2007/06/26/validation-with-enterprise-library-3-x.aspx"&gt;&lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://devlicio.us/blogs/ziemowit_skowronski/archive/2007/06/26/validation-with-enterprise-library-3-x.aspx" alt="kick it on DotNetKicks.com" border="0"&gt;&lt;/a&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=30375" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/ziemowit_skowronski/archive/tags/Tools/default.aspx">Tools</category><category domain="http://devlicio.us/blogs/ziemowit_skowronski/archive/tags/.NET+2.0/default.aspx">.NET 2.0</category><category domain="http://devlicio.us/blogs/ziemowit_skowronski/archive/tags/Tips+_2600_amp_3B00_+Tricks/default.aspx">Tips &amp;amp; Tricks</category></item><item><title>Continuous integration</title><link>http://devlicio.us/blogs/ziemowit_skowronski/archive/2007/03/02/continuous-integration.aspx</link><pubDate>Fri, 02 Mar 2007 10:27:00 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:13949</guid><dc:creator>Jimmy</dc:creator><slash:comments>4</slash:comments><description>&lt;P&gt;Well, last time I didn't blog too much so I've decide to start a new cycle. It's the best way to force myself to post more frequently. One of the subjects on top of my head was continuous integration so there we are. The other reason is that I will have a presentation on that subject on vBug meeting in Bristol in May and this will be good exercise for me. &lt;/P&gt;
&lt;P&gt;I believe that most of you know already what continuous integration is, so I think I can skip this and do some real work. If you need to learn about the subject, start from &lt;A href="http://www.google.co.uk/search?hl=en&amp;amp;q=Continuous+integration&amp;amp;meta="&gt;Google&lt;/A&gt; and &lt;A href="http://www.martinfowler.com/articles/continuousIntegration.html"&gt;Continuous Integration&lt;/A&gt; by &lt;A href="http://www.martinfowler.com/"&gt;Martin Fowler&lt;/A&gt;. &lt;/P&gt;
&lt;P&gt;Let us go to plan. As an example I will use very simple web application with some extra features that will require unit testing. In the next parts of the cycle I would like to show: &lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Setting build server with basic build using CruiseControl.NET, Subversion and MSBuild. &lt;/LI&gt;
&lt;LI&gt;Preparing very first build script. &lt;/LI&gt;
&lt;LI&gt;Setting up version and build number in application assembly. &lt;/LI&gt;
&lt;LI&gt;Deployment built application to the test site. &lt;/LI&gt;
&lt;LI&gt;Automated testing and code coverage analysis. &lt;/LI&gt;
&lt;LI&gt;Static analysis using FxCop.&lt;/LI&gt;
&lt;LI&gt;Generating documentation from code.&amp;nbsp;&lt;/LI&gt;
&lt;LI&gt;Email notification after build. &lt;/LI&gt;
&lt;LI&gt;Creating own tasks for MSBuild. &lt;/LI&gt;
&lt;LI&gt;Integration with Mantis bug tracking system.&amp;nbsp;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;I do think it will take me 6 to 10 posts in next two months. First post of the cycle should be on line to end of the week. &lt;/P&gt;
&lt;P&gt;Let me know if there is something you want me to add.&lt;/P&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=13949" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/ziemowit_skowronski/archive/tags/Tools/default.aspx">Tools</category><category domain="http://devlicio.us/blogs/ziemowit_skowronski/archive/tags/Agile/default.aspx">Agile</category><category domain="http://devlicio.us/blogs/ziemowit_skowronski/archive/tags/Continuous+integration/default.aspx">Continuous integration</category></item><item><title>SQL Doc Public Beta</title><link>http://devlicio.us/blogs/ziemowit_skowronski/archive/2006/11/08/sql-doc-public-beta.aspx</link><pubDate>Wed, 08 Nov 2006 12:02:00 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:483</guid><dc:creator>Jimmy</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;Red Gate recently published SQL Doc Beta on their &lt;a href="http://www.red-gate.com/messageboard/viewforum.php?f=54" target="_blank"&gt;forum&lt;/a&gt;. This is nice and simple tool for documenting SQL 2000 and 2005 databases can be downloaded &lt;a&gt;here&lt;/a&gt;. According to the forum announcement, this beta release includes:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Document one or many databases;
&lt;/li&gt;
&lt;li&gt;Produce documentation in HTML, with or without frames;
&lt;/li&gt;
&lt;li&gt;Includes all cross-database dependencies;
&lt;/li&gt;
&lt;li&gt;Live preview pane;
&lt;/li&gt;
&lt;li&gt;Command line access version.
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There are sample results for the Northwind database:&lt;/p&gt;
&lt;p&gt;General view:&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;a href="http://devlicio.us/photos/brendan/picture488.aspx" target="_blank"&gt;&lt;img src="http://devlicio.us/photos/brendan/images/488/440x375.aspx" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Table:&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;a href="http://devlicio.us/photos/brendan/picture485.aspx" target="_blank"&gt;&lt;img src="http://devlicio.us/photos/brendan/images/485/263x375.aspx" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;View:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;a href="http://devlicio.us/photos/brendan/picture486.aspx" target="_blank"&gt;&lt;img src="http://devlicio.us/photos/brendan/images/486/328x375.aspx" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Stored procedure:&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;a href="http://devlicio.us/photos/brendan/picture487.aspx" target="_blank"&gt;&lt;img src="http://devlicio.us/photos/brendan/images/487/328x375.aspx" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;If you have any comments or feature request just go to the forum and drop the line.&lt;/p&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=483" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/ziemowit_skowronski/archive/tags/Tools/default.aspx">Tools</category></item></channel></rss>