<?xml version="1.0" encoding="utf-8"?>
<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:georss="http://www.georss.org/georss" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>Static Void - .net 4</title>
    <link>http://martinwilley.com/blog/</link>
    <description>What next?</description>
    <language>en-us</language>
    <copyright>Martin Willey</copyright>
    <lastBuildDate>Fri, 31 May 2013 07:04:42 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 2.3.9074.18820</generator>
    <managingEditor>me@martinwilley.com</managingEditor>
    <webMaster>me@martinwilley.com</webMaster>
    <item>
      <trackback:ping>http://martinwilley.com/blog/Trackback.aspx?guid=732d4906-ff06-4681-9c23-90c30b3ba8b9</trackback:ping>
      <pingback:server>http://martinwilley.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://martinwilley.com/blog/PermaLink,guid,732d4906-ff06-4681-9c23-90c30b3ba8b9.aspx</pingback:target>
      <dc:creator>Martin</dc:creator>
      <georss:point>0 0</georss:point>
      <wfw:comment>http://martinwilley.com/blog/CommentView,guid,732d4906-ff06-4681-9c23-90c30b3ba8b9.aspx</wfw:comment>
      <wfw:commentRss>http://martinwilley.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=732d4906-ff06-4681-9c23-90c30b3ba8b9</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">WebAPI got updated 30 May 2013.<br /><br />
if you do a NuGet update you'll probably not be able to build afterwards.<br /><br />
WebAPI depends on WebAPI.WebHost 
<br />
which depends on WebAPI.Core 
<br />
which depends on Web.Client<br />
which depends on Microsoft.Net.Http<br />
which now depends on Microsoft.Bcl and Microsoft.Bcl.Build.<br /><br /><a href="http://nuget.org/packages/Microsoft.Bcl/">Microsoft.Bcl </a>is a portability
library which allows .Net 4 etc to use .Net 4.5 types. Apparently it has no effect
on 4.5<br /><br />
But it (or at least the Bcl.Build) has <a href="http://stackoverflow.com/questions/16832256/the-ensurebindingredirects-task-failed-unexpectedly">an
ugly bug</a> when you try to build<br /><font color="#FF0000">Error    12    The "EnsureBindingRedirects"
task failed unexpectedly.<br />
System.NullReferenceException: Object reference not set to an instance of an object.<br />
   at Roxel.BuildTasks.EnsureBindingRedirects.MergeBindingRedirectsFromElements(IEnumerable`1
dependentAssemblies)<br />
   at Roxel.BuildTasks.EnsureBindingRedirects.Execute()<br />
   at Microsoft.Build.BackEnd.TaskExecutionHost.Microsoft.Build.BackEnd.ITaskExecutionHost.Execute()<br />
   at Microsoft.Build.BackEnd.TaskBuilder.&lt;ExecuteInstantiatedTask&gt;d__20.MoveNext()   
Ems.WebApp</font><br /><br />
The fix is to add culture="neutral" to any binding redirects that are missing them.
In the default MVC template they are missing for some, and you almost certainly haven't
changed them.<br /><pre style="font-family:Consolas;font-size:13;color:black;background:white;"><span style="color:blue;">  &lt;</span><span style="color:#a31515;">runtime</span><span style="color:blue;">&gt;</span><span style="color:blue;">    &lt;</span><span style="color:#a31515;">assemblyBinding</span><span style="color:blue;"> </span><span style="color:red;">xmlns</span><span style="color:blue;">=</span>"<span style="color:blue;">urn:schemas-microsoft-com:asm.v1</span>"<span style="color:blue;">&gt;</span><span style="color:blue;">      &lt;</span><span style="color:#a31515;">dependentAssembly</span><span style="color:blue;">&gt;</span><span style="color:blue;">        &lt;</span><span style="color:#a31515;">assemblyIdentity</span><span style="color:blue;"> </span><span style="color:red;">name</span><span style="color:blue;">=</span>"<span style="color:blue;">System.Web.Helpers</span>"<span style="color:blue;"> </span><span style="color:red;">publicKeyToken</span><span style="color:blue;">=</span>"<span style="color:blue;">31bf3856ad364e35</span>"<span style="color:blue;"> </span><b><span style="color:red;">culture</span><span style="color:blue;">=</span>"<span style="color:blue;">neutral</span>"</b><span style="color:blue;"> /&gt;</span><span style="color:blue;">        &lt;</span><span style="color:#a31515;">bindingRedirect</span><span style="color:blue;"> </span><span style="color:red;">oldVersion</span><span style="color:blue;">=</span>"<span style="color:blue;">1.0.0.0-2.0.0.0</span>"<span style="color:blue;"> </span><span style="color:red;">newVersion</span><span style="color:blue;">=</span>"<span style="color:blue;">2.0.0.0</span>"<span style="color:blue;"> /&gt;</span><span style="color:blue;">      &lt;/</span><span style="color:#a31515;">dependentAssembly</span><span style="color:blue;">&gt;</span><span style="color:blue;">      &lt;</span><span style="color:#a31515;">dependentAssembly</span><span style="color:blue;">&gt;</span><span style="color:blue;">        &lt;</span><span style="color:#a31515;">assemblyIdentity</span><span style="color:blue;"> </span><span style="color:red;">name</span><span style="color:blue;">=</span>"<span style="color:blue;">System.Web.Mvc</span>"<span style="color:blue;"> </span><span style="color:red;">publicKeyToken</span><span style="color:blue;">=</span>"<span style="color:blue;">31bf3856ad364e35</span>"<span style="color:blue;"> </span><b><span style="color:red;">culture</span><span style="color:blue;">=</span>"<span style="color:blue;">neutral</span>"</b><span style="color:blue;"> /&gt;</span><span style="color:blue;">        &lt;</span><span style="color:#a31515;">bindingRedirect</span><span style="color:blue;"> </span><span style="color:red;">oldVersion</span><span style="color:blue;">=</span>"<span style="color:blue;">0.0.0.0-4.0.0.0</span>"<span style="color:blue;"> </span><span style="color:red;">newVersion</span><span style="color:blue;">=</span>"<span style="color:blue;">4.0.0.0</span>"<span style="color:blue;"> /&gt;</span><span style="color:blue;">      &lt;/</span><span style="color:#a31515;">dependentAssembly</span><span style="color:blue;">&gt;</span></pre>Do
a Rebuild (rather than a build) to ensure everything's loaded.<br /><br />
Hopefully there will be a update pretty soon.<br /><br /><br /><br /><p></p><img width="0" height="0" src="http://martinwilley.com/blog/aggbug.ashx?id=732d4906-ff06-4681-9c23-90c30b3ba8b9" /></body>
      <title>WebAPI updated 30 May 2013</title>
      <guid isPermaLink="false">http://martinwilley.com/blog/PermaLink,guid,732d4906-ff06-4681-9c23-90c30b3ba8b9.aspx</guid>
      <link>http://martinwilley.com/blog/2013/05/31/WebAPIUpdated30May2013.aspx</link>
      <pubDate>Fri, 31 May 2013 07:04:42 GMT</pubDate>
      <description>WebAPI got updated 30 May 2013.&lt;br&gt;
&lt;br&gt;
if you do a NuGet update you'll probably not be able to build afterwards.&lt;br&gt;
&lt;br&gt;
WebAPI depends on WebAPI.WebHost 
&lt;br&gt;
which depends on WebAPI.Core 
&lt;br&gt;
which depends on Web.Client&lt;br&gt;
which depends on Microsoft.Net.Http&lt;br&gt;
which now depends on Microsoft.Bcl and Microsoft.Bcl.Build.&lt;br&gt;
&lt;br&gt;
&lt;a href="http://nuget.org/packages/Microsoft.Bcl/"&gt;Microsoft.Bcl &lt;/a&gt;is a portability
library which allows .Net 4 etc to use .Net 4.5 types. Apparently it has no effect
on 4.5&lt;br&gt;
&lt;br&gt;
But it (or at least the Bcl.Build) has &lt;a href="http://stackoverflow.com/questions/16832256/the-ensurebindingredirects-task-failed-unexpectedly"&gt;an
ugly bug&lt;/a&gt; when you try to build&lt;br&gt;
&lt;font color="#FF0000"&gt;Error&amp;nbsp;&amp;nbsp;&amp;nbsp; 12&amp;nbsp;&amp;nbsp;&amp;nbsp; The "EnsureBindingRedirects"
task failed unexpectedly.&lt;br&gt;
System.NullReferenceException: Object reference not set to an instance of an object.&lt;br&gt;
&amp;nbsp;&amp;nbsp; at Roxel.BuildTasks.EnsureBindingRedirects.MergeBindingRedirectsFromElements(IEnumerable`1
dependentAssemblies)&lt;br&gt;
&amp;nbsp;&amp;nbsp; at Roxel.BuildTasks.EnsureBindingRedirects.Execute()&lt;br&gt;
&amp;nbsp;&amp;nbsp; at Microsoft.Build.BackEnd.TaskExecutionHost.Microsoft.Build.BackEnd.ITaskExecutionHost.Execute()&lt;br&gt;
&amp;nbsp;&amp;nbsp; at Microsoft.Build.BackEnd.TaskBuilder.&amp;lt;ExecuteInstantiatedTask&amp;gt;d__20.MoveNext()&amp;nbsp;&amp;nbsp;&amp;nbsp;
Ems.WebApp&lt;/font&gt;
&lt;br&gt;
&lt;br&gt;
The fix is to add culture="neutral" to any binding redirects that are missing them.
In the default MVC template they are missing for some, and you almost certainly haven't
changed them.&lt;br&gt;
&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;runtime&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;assemblyBinding&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;xmlns&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;urn:schemas-microsoft-com:asm.v1&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;dependentAssembly&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;assemblyIdentity&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;System.Web.Helpers&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;publicKeyToken&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;31bf3856ad364e35&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&lt;span style="color:red;"&gt;culture&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;neutral&lt;/span&gt;"&lt;/b&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;/&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;bindingRedirect&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;oldVersion&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;1.0.0.0-2.0.0.0&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;newVersion&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;2.0.0.0&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;nbsp;/&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;dependentAssembly&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;dependentAssembly&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;assemblyIdentity&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;System.Web.Mvc&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;publicKeyToken&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;31bf3856ad364e35&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&lt;span style="color:red;"&gt;culture&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;neutral&lt;/span&gt;"&lt;/b&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;/&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;bindingRedirect&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;oldVersion&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;0.0.0.0-4.0.0.0&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;newVersion&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;4.0.0.0&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;nbsp;/&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;dependentAssembly&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;Do
a Rebuild (rather than a build) to ensure everything's loaded.&lt;br&gt;
&lt;br&gt;
Hopefully there will be a update pretty soon.&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://martinwilley.com/blog/aggbug.ashx?id=732d4906-ff06-4681-9c23-90c30b3ba8b9" /&gt;</description>
      <comments>http://martinwilley.com/blog/CommentView,guid,732d4906-ff06-4681-9c23-90c30b3ba8b9.aspx</comments>
      <category>.net 4</category>
      <category>VS2012</category>
    </item>
    <item>
      <trackback:ping>http://martinwilley.com/blog/Trackback.aspx?guid=b9bb812a-e5ee-493b-b2fd-0c05ac0bf6b5</trackback:ping>
      <pingback:server>http://martinwilley.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://martinwilley.com/blog/PermaLink,guid,b9bb812a-e5ee-493b-b2fd-0c05ac0bf6b5.aspx</pingback:target>
      <dc:creator>Martin</dc:creator>
      <georss:point>0 0</georss:point>
      <wfw:comment>http://martinwilley.com/blog/CommentView,guid,b9bb812a-e5ee-493b-b2fd-0c05ac0bf6b5.aspx</wfw:comment>
      <wfw:commentRss>http://martinwilley.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=b9bb812a-e5ee-493b-b2fd-0c05ac0bf6b5</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">In EF Code First, context.SaveChanges()
automatically does validations.<br />
But lazy loading can collide with validations.<br /><br />
In our model, a Product must have a Category.<br /><br /><pre style="font-family:Consolas;font-size:13;color:black;background:white;"><span style="color:blue;">public</span> <span style="color:blue;">class</span> <span style="color:#2b91af;">Product</span> {
    [<span style="color:#2b91af;">Key</span>]     <span style="color:blue;">public</span> <span style="color:blue;">int</span> ProductId { <span style="color:blue;">get</span>; <span style="color:blue;">set</span>; }
    [<span style="color:#2b91af;">Required</span>]     [<span style="color:#2b91af;">StringLength</span>(40)]
    <span style="color:blue;">public</span> <span style="color:blue;">string</span> ProductName { <span style="color:blue;">get</span>; <span style="color:blue;">set</span>; }
    [<span style="color:#2b91af;">Required</span>]     <span style="color:blue;">public</span> <span style="color:blue;">virtual</span> <span style="color:#2b91af;">Category</span> Category { <span style="color:blue;">get</span>; <span style="color:blue;">set</span>; }
}</pre><br />
Let's try this...<br /><pre style="font-family:Consolas;font-size:13;color:black;background:white;"><span style="color:blue;">using</span> (<span style="color:blue;">var</span> context = <span style="color:blue;">new</span> <span style="color:#2b91af;">NorthwindContext</span>())
{     <span style="color:green;">//find a specific product</span>     <span style="color:blue;">var</span> product = context.Products.Find(147);
    <span style="color:green;">//set a new name</span>     product.ProductName = <span style="color:#2b91af;">Guid</span>.NewGuid().ToString();
    <span style="color:green;">//ERROR!</span>     context.SaveChanges();
}</pre><br /><br />
Oh no, System.Data.Entity.Validation.DbEntityValidationException. "Validation failed
for one or more entities." How can that be? We just loaded it from the database, it
must be correct?<br />
The exception says that Category is null. But it exists in the database. 
<br /><br />
If you inspect it in the debugger, you can see the category ... and if you continue
the SaveChanges succeeds. The debugger triggered a lazy load, so it works.<br /><br />
context.SaveChanges() internally turns off lazy loading before validating. Which is
good, because you don't want unnecessary database access. But when the reference is
required, the validation doesn't recognise this is a proxy which has a categoryId
but hasn't loaded it.<br /><br /><h2>Solution 1- no auto validation
</h2><br />
One solution is to turn off validation. When you are setting individual properties
with values you've already validated, you do not need it here.<br /><br /><pre style="font-family:Consolas;font-size:13;color:black;background:white;">context.Configuration.ValidateOnSaveEnabled = <span style="color:blue;">false</span>;
context.SaveChanges(); </pre><br />
The SQL, by the way, is update [dbo].[Products] set [ProductName] = @0 where ([ProductID]
= @1).<br />
(Check it by hooking up a SQL logger, <a href="http://martinwilley.com/blog/2012/02/14/EFCodeFirstTracingLoggingTheSQL.aspx">as
described here</a>)<br /><br />
An alternative is to cheat the model- ensure references are not Required. 
<br /><br />
But if you have a product coming back from a UI for insert or update, you need to
manually validate that it always has a category. 
<br /><br /><h2>Solution 2- ensure required references are loaded
</h2><br />
This triggers extra database access, but you can keep the automatic validation.<br /><br /><pre style="font-family:Consolas;font-size:13;color:black;background:white;"><span style="color:green;">//find a specific product</span><span style="color:blue;">var</span> product = context.Products.Find(147); <span style="color:green;">//make sure it's loaded</span> context.Entry(product).Reference(p =&gt; p.Category).Load();</pre><br />
If you load from a query, you can use an .Include(p =&gt; p.Category) which will load
the product with a join to the category table, so there is only one sql statement.
This will bypass the internal cache so if it was loaded the same product earlier,
you can't save any data access.<br /><pre style="font-family:Consolas;font-size:13;color:black;background:white;"><span style="color:blue;">var</span> product = context.Products
    .Include(p =&gt; p.Category)     .First(p =&gt; p.ProductId == 147);</pre><br /><h2>Solution 3- Add a foreign key Id property
</h2><br />
You can specify foreign key Id properties in addition to the instance property.<br /><pre style="font-family:Consolas;font-size:13;color:black;background:white;"><span style="color:green;">//it's not nullable so it's implicitly required</span><span style="color:blue;">public</span><span style="color:blue;">int</span> CategoryId { <span style="color:blue;">get</span>; <span style="color:blue;">set</span>; } <span style="color:blue;">public</span> <span style="color:blue;">virtual</span> <span style="color:#2b91af;">Category</span> Category { <span style="color:blue;">get</span>; <span style="color:blue;">set</span>; }</pre><br /><br />
Note the CategoryId is now required. The Category instance isn't. Validation can check
the CategoryId, and we can set it directly without having to load the instance.<br /><br />
You have to map this arrangement (unless you like to see an EntityCommandCompilationException
with the inner exception message being "More than one item in the metadata collection
match the identity 'CategoryId'." - I didn't).<br />
In the EntityTypeConfiguration&lt;Product&gt; the mapping must point to the foreign
key id property. 
<br /><pre style="font-family:Consolas;font-size:13;color:black;background:white;">HasRequired(x =&gt; x.Category)
    .WithMany()
    .HasForeignKey(p =&gt; p.CategoryId);</pre><br /><br />
We've "denormalized" our entity model here, but it makes dealing with detached objects
and viewmodels a little easier. 
<br /><br />
But won't the CategoryId and Category properties get out of step? If you set one,
which gets persisted? 
<br /><br />
Let's set the foreign key id property.<br /><pre style="font-family:Consolas;font-size:13;color:black;background:white;"><span style="color:green;">//find a specific product</span><span style="color:blue;">var</span> product = context.Products.Find(146); <span style="color:green;">//it's category 4 in both</span><span style="color:#2b91af;">Console</span>.WriteLine(product.Category.CategoryId); <span style="color:#2b91af;">Console</span>.WriteLine(product.CategoryId); <span style="color:green;">//set the categoryId property</span> product.CategoryId = 1; <span style="color:green;">//we've just set it, so it's 1</span><span style="color:#2b91af;">Console</span>.WriteLine(product.CategoryId); <span style="color:green;">//oh no, still says 4!</span><span style="color:#2b91af;">Console</span>.WriteLine(product.Category.CategoryId);</pre><br /><br />
context.SaveChanges() does the right thing- it saves the new value, 1, assigned to
the id property.<br /><br />
Let's set the instance.<br /><pre style="font-family:Consolas;font-size:13;color:black;background:white;"><span style="color:green;">//find a specific product</span><span style="color:blue;">var</span> product = context.Products.Find(146); <span style="color:green;">//it's category 1 in both</span><span style="color:#2b91af;">Console</span>.WriteLine(product.Category.CategoryId); <span style="color:#2b91af;">Console</span>.WriteLine(product.CategoryId); <span style="color:green;">//set the category instance</span> product.Category = context.Categories.Find(2); <span style="color:green;">//we've just set it, so it's 2</span><span style="color:#2b91af;">Console</span>.WriteLine(product.Category.CategoryId); <span style="color:green;">//oh no, still says 1!</span><span style="color:#2b91af;">Console</span>.WriteLine(product.CategoryId); </pre><br /><br />
But again, context.SaveChanges() does the right thing- it saves the new value, 2,
assigned to the instance.<br /><br />
So it looks like persistence always works as you'd expect, but the properties get
out of step. You must be careful in your workflow. This won't work...<br /><pre style="font-family:Consolas;font-size:13;color:black;background:white;">product.CategoryId = 1;
<span style="color:blue;">var</span> returnMessage = <span style="color:#a31515;">"Category updated to "</span> + product.Category.CategoryName; </pre><br /><br /><h2>Conclusion
</h2>
In most cases I'd prefer to remove validation on save with context.Configuration.ValidateOnSaveEnabled
= false - as long as the values were validated downstream (perhaps in the UI validation
framework).<br /><br />
But exposing the foreign key property is undoubtably convenient when the UI just sends
you categoryId= 1 and you don't want to load that category from the database just
so you can persist product.<img width="0" height="0" src="http://martinwilley.com/blog/aggbug.ashx?id=b9bb812a-e5ee-493b-b2fd-0c05ac0bf6b5" /></body>
      <title>EF Code First - references vs validation</title>
      <guid isPermaLink="false">http://martinwilley.com/blog/PermaLink,guid,b9bb812a-e5ee-493b-b2fd-0c05ac0bf6b5.aspx</guid>
      <link>http://martinwilley.com/blog/2012/02/22/EFCodeFirstReferencesVsValidation.aspx</link>
      <pubDate>Wed, 22 Feb 2012 10:45:48 GMT</pubDate>
      <description>In EF Code First, context.SaveChanges() automatically does validations.&lt;br&gt;
But lazy loading can collide with validations.&lt;br&gt;
&lt;br&gt;
In our model, a Product must have a Category.&lt;br&gt;
&lt;br&gt;
&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;Product&lt;/span&gt; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[&lt;span style="color:#2b91af;"&gt;Key&lt;/span&gt;] &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;int&lt;/span&gt;&amp;nbsp;ProductId&amp;nbsp;{&amp;nbsp;&lt;span style="color:blue;"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color:blue;"&gt;set&lt;/span&gt;;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[&lt;span style="color:#2b91af;"&gt;Required&lt;/span&gt;] &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[&lt;span style="color:#2b91af;"&gt;StringLength&lt;/span&gt;(40)]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;nbsp;ProductName&amp;nbsp;{&amp;nbsp;&lt;span style="color:blue;"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color:blue;"&gt;set&lt;/span&gt;;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[&lt;span style="color:#2b91af;"&gt;Required&lt;/span&gt;] &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;virtual&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;Category&lt;/span&gt;&amp;nbsp;Category&amp;nbsp;{&amp;nbsp;&lt;span style="color:blue;"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color:blue;"&gt;set&lt;/span&gt;;&amp;nbsp;}
}&lt;/pre&gt;
&lt;br&gt;
Let's try this...&lt;br&gt;
&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;&lt;span style="color:blue;"&gt;using&lt;/span&gt;&amp;nbsp;(&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;context&amp;nbsp;=&amp;nbsp;&lt;span style="color:blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;NorthwindContext&lt;/span&gt;())
{ &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:green;"&gt;//find&amp;nbsp;a&amp;nbsp;specific&amp;nbsp;product&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;product&amp;nbsp;=&amp;nbsp;context.Products.Find(147);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:green;"&gt;//set&amp;nbsp;a&amp;nbsp;new&amp;nbsp;name&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;product.ProductName&amp;nbsp;=&amp;nbsp;&lt;span style="color:#2b91af;"&gt;Guid&lt;/span&gt;.NewGuid().ToString();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:green;"&gt;//ERROR!&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;context.SaveChanges();
}&lt;/pre&gt;
&lt;br&gt;
&lt;br&gt;
Oh no, System.Data.Entity.Validation.DbEntityValidationException. "Validation failed
for one or more entities." How can that be? We just loaded it from the database, it
must be correct?&lt;br&gt;
The exception says that Category is null. But it exists in the database. 
&lt;br&gt;
&lt;br&gt;
If you inspect it in the debugger, you can see the category ... and if you continue
the SaveChanges succeeds. The debugger triggered a lazy load, so it works.&lt;br&gt;
&lt;br&gt;
context.SaveChanges() internally turns off lazy loading before validating. Which is
good, because you don't want unnecessary database access. But when the reference is
required, the validation doesn't recognise this is a proxy which has a categoryId
but hasn't loaded it.&lt;br&gt;
&lt;br&gt;
&lt;h2&gt;Solution 1- no auto validation
&lt;/h2&gt;
&lt;br&gt;
One solution is to turn off validation. When you are setting individual properties
with values you've already validated, you do not need it here.&lt;br&gt;
&lt;br&gt;
&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;context.Configuration.ValidateOnSaveEnabled&amp;nbsp;=&amp;nbsp;&lt;span style="color:blue;"&gt;false&lt;/span&gt;;
context.SaveChanges(); &lt;/pre&gt;
&lt;br&gt;
The SQL, by the way, is update [dbo].[Products] set [ProductName] = @0 where ([ProductID]
= @1).&lt;br&gt;
(Check it by hooking up a SQL logger, &lt;a href="http://martinwilley.com/blog/2012/02/14/EFCodeFirstTracingLoggingTheSQL.aspx"&gt;as
described here&lt;/a&gt;)&lt;br&gt;
&lt;br&gt;
An alternative is to cheat the model- ensure references are not Required. 
&lt;br&gt;
&lt;br&gt;
But if you have a product coming back from a UI for insert or update, you need to
manually validate that it always has a category. 
&lt;br&gt;
&lt;br&gt;
&lt;h2&gt;Solution 2- ensure required references are loaded
&lt;/h2&gt;
&lt;br&gt;
This triggers extra database access, but you can keep the automatic validation.&lt;br&gt;
&lt;br&gt;
&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;&lt;span style="color:green;"&gt;//find&amp;nbsp;a&amp;nbsp;specific&amp;nbsp;product&lt;/span&gt; &lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;product&amp;nbsp;=&amp;nbsp;context.Products.Find(147); &lt;span style="color:green;"&gt;//make&amp;nbsp;sure&amp;nbsp;it's&amp;nbsp;loaded&lt;/span&gt; context.Entry(product).Reference(p&amp;nbsp;=&amp;gt;&amp;nbsp;p.Category).Load();&lt;/pre&gt;
&lt;br&gt;
If you load from a query, you can use an .Include(p =&amp;gt; p.Category) which will load
the product with a join to the category table, so there is only one sql statement.
This will bypass the internal cache so if it was loaded the same product earlier,
you can't save any data access.&lt;br&gt;
&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;product&amp;nbsp;=&amp;nbsp;context.Products
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Include(p&amp;nbsp;=&amp;gt;&amp;nbsp;p.Category) &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.First(p&amp;nbsp;=&amp;gt;&amp;nbsp;p.ProductId&amp;nbsp;==&amp;nbsp;147);&lt;/pre&gt;
&lt;br&gt;
&lt;h2&gt;Solution 3- Add a foreign key Id property
&lt;/h2&gt;
&lt;br&gt;
You can specify foreign key Id properties in addition to the instance property.&lt;br&gt;
&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;&lt;span style="color:green;"&gt;//it's&amp;nbsp;not&amp;nbsp;nullable&amp;nbsp;so&amp;nbsp;it's&amp;nbsp;implicitly&amp;nbsp;required&lt;/span&gt; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;int&lt;/span&gt;&amp;nbsp;CategoryId&amp;nbsp;{&amp;nbsp;&lt;span style="color:blue;"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color:blue;"&gt;set&lt;/span&gt;;&amp;nbsp;} &lt;span style="color:blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;virtual&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;Category&lt;/span&gt;&amp;nbsp;Category&amp;nbsp;{&amp;nbsp;&lt;span style="color:blue;"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color:blue;"&gt;set&lt;/span&gt;;&amp;nbsp;}&lt;/pre&gt;
&lt;br&gt;
&lt;br&gt;
Note the CategoryId is now required. The Category instance isn't. Validation can check
the CategoryId, and we can set it directly without having to load the instance.&lt;br&gt;
&lt;br&gt;
You have to map this arrangement (unless you like to see an EntityCommandCompilationException
with the inner exception message being "More than one item in the metadata collection
match the identity 'CategoryId'." - I didn't).&lt;br&gt;
In the EntityTypeConfiguration&amp;lt;Product&amp;gt; the mapping must point to the foreign
key id property. 
&lt;br&gt;
&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;HasRequired(x&amp;nbsp;=&amp;gt;&amp;nbsp;x.Category)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.WithMany()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.HasForeignKey(p&amp;nbsp;=&amp;gt;&amp;nbsp;p.CategoryId);&lt;/pre&gt;
&lt;br&gt;
&lt;br&gt;
We've "denormalized" our entity model here, but it makes dealing with detached objects
and viewmodels a little easier. 
&lt;br&gt;
&lt;br&gt;
But won't the CategoryId and Category properties get out of step? If you set one,
which gets persisted? 
&lt;br&gt;
&lt;br&gt;
Let's set the foreign key id property.&lt;br&gt;
&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;&lt;span style="color:green;"&gt;//find&amp;nbsp;a&amp;nbsp;specific&amp;nbsp;product&lt;/span&gt; &lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;product&amp;nbsp;=&amp;nbsp;context.Products.Find(146); &lt;span style="color:green;"&gt;//it's&amp;nbsp;category&amp;nbsp;4&amp;nbsp;in&amp;nbsp;both&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(product.Category.CategoryId); &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(product.CategoryId); &lt;span style="color:green;"&gt;//set&amp;nbsp;the&amp;nbsp;categoryId&amp;nbsp;property&lt;/span&gt; product.CategoryId&amp;nbsp;=&amp;nbsp;1; &lt;span style="color:green;"&gt;//we've&amp;nbsp;just&amp;nbsp;set&amp;nbsp;it,&amp;nbsp;so&amp;nbsp;it's&amp;nbsp;1&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(product.CategoryId); &lt;span style="color:green;"&gt;//oh&amp;nbsp;no,&amp;nbsp;still&amp;nbsp;says&amp;nbsp;4!&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(product.Category.CategoryId);&lt;/pre&gt;
&lt;br&gt;
&lt;br&gt;
context.SaveChanges() does the right thing- it saves the new value, 1, assigned to
the id property.&lt;br&gt;
&lt;br&gt;
Let's set the instance.&lt;br&gt;
&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;&lt;span style="color:green;"&gt;//find&amp;nbsp;a&amp;nbsp;specific&amp;nbsp;product&lt;/span&gt; &lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;product&amp;nbsp;=&amp;nbsp;context.Products.Find(146); &lt;span style="color:green;"&gt;//it's&amp;nbsp;category&amp;nbsp;1&amp;nbsp;in&amp;nbsp;both&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(product.Category.CategoryId); &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(product.CategoryId); &lt;span style="color:green;"&gt;//set&amp;nbsp;the&amp;nbsp;category&amp;nbsp;instance&lt;/span&gt; product.Category&amp;nbsp;=&amp;nbsp;context.Categories.Find(2); &lt;span style="color:green;"&gt;//we've&amp;nbsp;just&amp;nbsp;set&amp;nbsp;it,&amp;nbsp;so&amp;nbsp;it's&amp;nbsp;2&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(product.Category.CategoryId); &lt;span style="color:green;"&gt;//oh&amp;nbsp;no,&amp;nbsp;still&amp;nbsp;says&amp;nbsp;1!&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(product.CategoryId); &lt;/pre&gt;
&lt;br&gt;
&lt;br&gt;
But again, context.SaveChanges() does the right thing- it saves the new value, 2,
assigned to the instance.&lt;br&gt;
&lt;br&gt;
So it looks like persistence always works as you'd expect, but the properties get
out of step. You must be careful in your workflow. This won't work...&lt;br&gt;
&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;product.CategoryId&amp;nbsp;=&amp;nbsp;1;
&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;returnMessage&amp;nbsp;=&amp;nbsp;&lt;span style="color:#a31515;"&gt;"Category&amp;nbsp;updated&amp;nbsp;to&amp;nbsp;"&lt;/span&gt;&amp;nbsp;+&amp;nbsp;product.Category.CategoryName; &lt;/pre&gt;
&lt;br&gt;
&lt;br&gt;
&lt;h2&gt;Conclusion
&lt;/h2&gt;
In most cases I'd prefer to remove validation on save with context.Configuration.ValidateOnSaveEnabled
= false - as long as the values were validated downstream (perhaps in the UI validation
framework).&lt;br&gt;
&lt;br&gt;
But exposing the foreign key property is undoubtably convenient when the UI just sends
you categoryId= 1 and you don't want to load that category from the database just
so you can persist product.&lt;img width="0" height="0" src="http://martinwilley.com/blog/aggbug.ashx?id=b9bb812a-e5ee-493b-b2fd-0c05ac0bf6b5" /&gt;</description>
      <comments>http://martinwilley.com/blog/CommentView,guid,b9bb812a-e5ee-493b-b2fd-0c05ac0bf6b5.aspx</comments>
      <category>.net 4</category>
      <category>Code First</category>
      <category>Entity Framework</category>
    </item>
    <item>
      <trackback:ping>http://martinwilley.com/blog/Trackback.aspx?guid=ce15092e-2857-450d-b20f-534afedd5d2f</trackback:ping>
      <pingback:server>http://martinwilley.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://martinwilley.com/blog/PermaLink,guid,ce15092e-2857-450d-b20f-534afedd5d2f.aspx</pingback:target>
      <dc:creator>Martin</dc:creator>
      <georss:point>0 0</georss:point>
      <wfw:comment>http://martinwilley.com/blog/CommentView,guid,ce15092e-2857-450d-b20f-534afedd5d2f.aspx</wfw:comment>
      <wfw:commentRss>http://martinwilley.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=ce15092e-2857-450d-b20f-534afedd5d2f</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">I wanted to log the SQL so I can profile
a Entity Framework Code First application.<br /><br /><a href="http://code.google.com/p/mvc-mini-profiler/">MVC Mini-Profiler</a> only works
in an ASP MVC application- not in console or unit tests. 
<br /><br />
The <a href="http://code.msdn.microsoft.com/EFProviderWrappers-c0b88f32">tracing and
caching providers for Entity Framework</a> expect ObjectContexts (EF 4.0), not DbContexts.
But we can make them work. 
<br /><br />
Scenario:<br />
I have a code first project with my DbContext, called NorthwindContext.<br />
I have a unit test project, with a test that uses NorthwindContext<br /><br />
Here's the steps.<br /><br />
1. Download the <a href="http://code.msdn.microsoft.com/EFProviderWrappers-c0b88f32">providers</a>.<br />
2 (Optional): review the Q&amp;A and apply some of the suggested patches.<br />
3. Build the solution.<br />
4. The unit test project will reference the dlls from the tracing provider<br />
EFProviderWrapperToolkit.dll<br />
EFTracingProvider.dll<br />
5. Add an App.config to the unit test project something like this:<br /><pre style="font-family:Consolas;font-size:13;color:black;background:white;"><span style="color:blue;">&lt;?</span><span style="color:#a31515;">xml</span><span style="color:blue;"> </span><span style="color:red;">version</span><span style="color:blue;">=</span>"<span style="color:blue;">1.0</span>"<span style="color:blue;"> </span><span style="color:red;">encoding</span><span style="color:blue;">=</span>"<span style="color:blue;">utf-8</span>"<span style="color:blue;">?&gt;</span><span style="color:blue;">&lt;</span><span style="color:#a31515;">configuration</span><span style="color:blue;">&gt;</span><span style="color:blue;"></span><span style="color:blue;"> 
&lt;</span><span style="color:#a31515;">connectionStrings</span><span style="color:blue;">&gt;</span><span style="color:blue;">    &lt;</span><span style="color:#a31515;">add</span><span style="color:blue;"> </span><span style="color:red;">name</span><span style="color:blue;">=</span>"<span style="color:blue;">NorthwindContext</span>"<span style="color:blue;"> </span><span style="color:blue;">         </span><span style="color:red;">providerName</span><span style="color:blue;">=</span>"<span style="color:blue;">System.Data.SqlClient</span>"<span style="color:blue;"> </span><span style="color:blue;">         </span><span style="color:red;">connectionString</span><span style="color:blue;">=</span>"<span style="color:blue;">Data Source=.\SQLEXPRESS;Initial Catalog=Northwind;Integrated Security=True;Pooling=False;MultipleActiveResultSets=True</span>"<span style="color:blue;"> /&gt;</span><span style="color:blue;">  &lt;/</span><span style="color:#a31515;">connectionStrings</span><span style="color:blue;">&gt;</span><span style="color:blue;">  &lt;</span><span style="color:#a31515;">system.data</span><span style="color:blue;">&gt;</span><span style="color:blue;">    &lt;</span><span style="color:#a31515;">DbProviderFactories</span><span style="color:blue;">&gt;</span><span style="color:blue;">      &lt;</span><span style="color:#a31515;">add</span><span style="color:blue;"> </span><span style="color:red;">name</span><span style="color:blue;">=</span>"<span style="color:blue;">EF Tracing Data Provider</span>"<span style="color:blue;"> </span><span style="color:blue;">           </span><span style="color:red;">invariant</span><span style="color:blue;">=</span>"<span style="color:blue;">EFTracingProvider</span>"<span style="color:blue;"> </span><span style="color:blue;">           </span><span style="color:red;">description</span><span style="color:blue;">=</span>"<span style="color:blue;">Tracing Provider Wrapper</span>"<span style="color:blue;"> </span><span style="color:blue;">           </span><span style="color:red;">type</span><span style="color:blue;">=</span>"<span style="color:blue;">EFTracingProvider.EFTracingProviderFactory, EFTracingProvider, Version=1.0.0.0, Culture=neutral, PublicKeyToken=def642f226e0e59b</span>"<span style="color:blue;"> /&gt;</span><span style="color:blue;">      &lt;</span><span style="color:#a31515;">add</span><span style="color:blue;"> </span><span style="color:red;">name</span><span style="color:blue;">=</span>"<span style="color:blue;">EF Generic Provider Wrapper</span>"<span style="color:blue;"> </span><span style="color:blue;">           </span><span style="color:red;">invariant</span><span style="color:blue;">=</span>"<span style="color:blue;">EFProviderWrapper</span>"<span style="color:blue;"> </span><span style="color:blue;">           </span><span style="color:red;">description</span><span style="color:blue;">=</span>"<span style="color:blue;">Generic Provider Wrapper</span>"<span style="color:blue;"> </span><span style="color:blue;">           </span><span style="color:red;">type</span><span style="color:blue;">=</span>"<span style="color:blue;">EFProviderWrapperToolkit.EFProviderWrapperFactory, EFProviderWrapperToolkit, Version=1.0.0.0, Culture=neutral, PublicKeyToken=def642f226e0e59b</span>"<span style="color:blue;"> /&gt;</span><span style="color:blue;">    &lt;/</span><span style="color:#a31515;">DbProviderFactories</span><span style="color:blue;">&gt;</span><span style="color:blue;">  &lt;/</span><span style="color:#a31515;">system.data</span><span style="color:blue;">&gt;</span><span style="color:blue;">&lt;/</span><span style="color:#a31515;">configuration</span><span style="color:blue;">&gt;</span></pre>6.
In the DbContext, we need to use two of the base constructors<br /><pre style="font-family:Consolas;font-size:13;color:black;background:white;">        <span style="color:blue;">public</span> NorthwindContext()
        {             <span style="color:green;">//default ctor, uses app.config connection string named "NorthwindContext"</span>         }
        <span style="color:blue;">public</span> NorthwindContext(<span style="color:#2b91af;">DbConnection</span> connection)
            :<span style="color:blue;">base</span>(connection,<span style="color:blue;">true</span>)
        {            <span style="color:green;">//ctor uses for tracing </span>         }</pre>7.
In my test, you need to use the overload that takes the DbConnection.<br /><pre style="font-family:Consolas;font-size:13;color:black;background:white;">            <span style="color:blue;">using</span> (<span style="color:blue;">var</span> context = <span style="color:blue;">new</span> <span style="color:#2b91af;">NorthwindContext</span>(
                CreateConnectionWrapper(<span style="color:#a31515;">@"name=NorthwindContext"</span>)))
            {                 <span style="color:green;">//profile this!</span>                 <span style="color:blue;">var</span> product = context.ProductCollection.Find(1);
            }</pre>8.
And add the CreateConnectionWrapper method:<br /><pre style="font-family:Consolas;font-size:13;color:black;background:white;"><span style="color:blue;">private</span> <span style="color:blue;">static</span> <span style="color:#2b91af;">DbConnection</span> CreateConnectionWrapper(<span style="color:blue;">string</span> nameOrConnectionString)
{     <span style="color:blue;">var</span> providerInvariantName = <span style="color:#a31515;">"System.Data.SqlClient"</span>;
    <span style="color:blue;">var</span> connectionString = nameOrConnectionString;
    <span style="color:green;">//name=connectionName format</span>     <span style="color:blue;">var</span> index = nameOrConnectionString.IndexOf(<span style="color:#a31515;">'='</span>);
    <span style="color:blue;">if</span> (index &gt; 0 &amp;&amp;
nameOrConnectionString.Substring(0, index).Trim()         .Equals(<span style="color:#a31515;">"name"</span>, <span style="color:#2b91af;">StringComparison</span>.OrdinalIgnoreCase))
    {         nameOrConnectionString = nameOrConnectionString
            .Substring(index + 1).Trim();
    }     <span style="color:green;">//look up connection string name</span>     <span style="color:blue;">var</span> connectionStringSetting =
        <span style="color:#2b91af;">ConfigurationManager</span>.ConnectionStrings[nameOrConnectionString];
    <span style="color:blue;">if</span> (connectionStringSetting != <span style="color:blue;">null</span>)
    {         providerInvariantName = connectionStringSetting.ProviderName;
        connectionString = connectionStringSetting.ConnectionString;
    }     <span style="color:green;">//create the special connection string with the provider name in it</span>     <span style="color:blue;">var</span> wrappedConnectionString = <span style="color:#a31515;">"wrappedProvider="</span> + 
        providerInvariantName + <span style="color:#a31515;">";"</span> + 
        connectionString;     <span style="color:green;">//create the tracing wrapper</span>     <span style="color:blue;">var</span> connection = <span style="color:blue;">new</span> <span style="color:#2b91af;">EFTracingConnection</span>                             {
                                ConnectionString = wrappedConnectionString
                            };
    <span style="color:green;">//hook up logging here</span>     connection.CommandFinished +=
        (sender, args) =&gt; <span style="color:#2b91af;">Console</span>.WriteLine(args.ToTraceString());
    <span style="color:blue;">return</span> connection; }</pre>This
should cope with connection strings in the 3 common forms ("Northwind", "name=Northwind"
and "Data Source=.\SQLEXPRESS;Initial Catalog=Northwind ...")<br /><br />
Note the line to hook up logging (subscribing to the connection.CommandFinished event).
We could simply have used 
<br /><pre style="font-family: Consolas; font-size: 13px; color: black; background: none repeat scroll 0% 0% white;"><span style="color:#2b91af;">EFTracingProviderConfiguration</span>.LogToConsole = <span style="color:blue;">true</span>; 
<br /></pre><p>
Or you can hook up to log4net or EntLib logging to those tracing events. 
<br /></p><p><br /></p><pre style="font-family:Consolas;font-size:13;color:black;background:white;"><br /></pre><p></p><img width="0" height="0" src="http://martinwilley.com/blog/aggbug.ashx?id=ce15092e-2857-450d-b20f-534afedd5d2f" /></body>
      <title>EF Code First tracing - logging the SQL</title>
      <guid isPermaLink="false">http://martinwilley.com/blog/PermaLink,guid,ce15092e-2857-450d-b20f-534afedd5d2f.aspx</guid>
      <link>http://martinwilley.com/blog/2012/02/14/EFCodeFirstTracingLoggingTheSQL.aspx</link>
      <pubDate>Tue, 14 Feb 2012 13:11:00 GMT</pubDate>
      <description>I wanted to log the SQL so I can profile a Entity Framework Code First application.&lt;br&gt;
&lt;br&gt;
&lt;a href="http://code.google.com/p/mvc-mini-profiler/"&gt;MVC Mini-Profiler&lt;/a&gt; only works
in an ASP MVC application- not in console or unit tests. 
&lt;br&gt;
&lt;br&gt;
The &lt;a href="http://code.msdn.microsoft.com/EFProviderWrappers-c0b88f32"&gt;tracing and
caching providers for Entity Framework&lt;/a&gt; expect ObjectContexts (EF 4.0), not DbContexts.
But we can make them work. 
&lt;br&gt;
&lt;br&gt;
Scenario:&lt;br&gt;
I have a code first project with my DbContext, called NorthwindContext.&lt;br&gt;
I have a unit test project, with a test that uses NorthwindContext&lt;br&gt;
&lt;br&gt;
Here's the steps.&lt;br&gt;
&lt;br&gt;
1. Download the &lt;a href="http://code.msdn.microsoft.com/EFProviderWrappers-c0b88f32"&gt;providers&lt;/a&gt;.&lt;br&gt;
2 (Optional): review the Q&amp;amp;A and apply some of the suggested patches.&lt;br&gt;
3. Build the solution.&lt;br&gt;
4. The unit test project will reference the dlls from the tracing provider&lt;br&gt;
EFProviderWrapperToolkit.dll&lt;br&gt;
EFTracingProvider.dll&lt;br&gt;
5. Add an App.config to the unit test project something like this:&lt;br&gt;
&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color:#a31515;"&gt;xml&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;version&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;1.0&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;encoding&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;utf-8&lt;/span&gt;"&lt;span style="color:blue;"&gt;?&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;configuration&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;
&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;connectionStrings&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;add&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;NorthwindContext&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;providerName&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;System.Data.SqlClient&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;connectionString&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;Data&amp;nbsp;Source=.\SQLEXPRESS;Initial&amp;nbsp;Catalog=Northwind;Integrated&amp;nbsp;Security=True;Pooling=False;MultipleActiveResultSets=True&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;nbsp;/&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;connectionStrings&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;system.data&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;DbProviderFactories&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;add&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;EF&amp;nbsp;Tracing&amp;nbsp;Data&amp;nbsp;Provider&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;invariant&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;EFTracingProvider&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;description&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;Tracing&amp;nbsp;Provider&amp;nbsp;Wrapper&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;type&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;EFTracingProvider.EFTracingProviderFactory,&amp;nbsp;EFTracingProvider,&amp;nbsp;Version=1.0.0.0,&amp;nbsp;Culture=neutral,&amp;nbsp;PublicKeyToken=def642f226e0e59b&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;nbsp;/&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;add&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;EF&amp;nbsp;Generic&amp;nbsp;Provider&amp;nbsp;Wrapper&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;invariant&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;EFProviderWrapper&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;description&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;Generic&amp;nbsp;Provider&amp;nbsp;Wrapper&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;type&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;EFProviderWrapperToolkit.EFProviderWrapperFactory,&amp;nbsp;EFProviderWrapperToolkit,&amp;nbsp;Version=1.0.0.0,&amp;nbsp;Culture=neutral,&amp;nbsp;PublicKeyToken=def642f226e0e59b&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;nbsp;/&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;DbProviderFactories&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;system.data&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;configuration&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;6.
In the DbContext, we need to use two of the base constructors&lt;br&gt;
&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;public&lt;/span&gt;&amp;nbsp;NorthwindContext()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:green;"&gt;//default&amp;nbsp;ctor,&amp;nbsp;uses&amp;nbsp;app.config&amp;nbsp;connection&amp;nbsp;string&amp;nbsp;named&amp;nbsp;"NorthwindContext"&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;public&lt;/span&gt;&amp;nbsp;NorthwindContext(&lt;span style="color:#2b91af;"&gt;DbConnection&lt;/span&gt;&amp;nbsp;connection)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&lt;span style="color:blue;"&gt;base&lt;/span&gt;(connection,&lt;span style="color:blue;"&gt;true&lt;/span&gt;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:green;"&gt;//ctor&amp;nbsp;uses&amp;nbsp;for&amp;nbsp;tracing&amp;nbsp;&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/pre&gt;7.
In my test, you need to use the overload that takes the DbConnection.&lt;br&gt;
&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;using&lt;/span&gt;&amp;nbsp;(&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;context&amp;nbsp;=&amp;nbsp;&lt;span style="color:blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;NorthwindContext&lt;/span&gt;(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CreateConnectionWrapper(&lt;span style="color:#a31515;"&gt;@"name=NorthwindContext"&lt;/span&gt;)))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:green;"&gt;//profile&amp;nbsp;this!&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;product&amp;nbsp;=&amp;nbsp;context.ProductCollection.Find(1);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/pre&gt;8.
And add the CreateConnectionWrapper method:&lt;br&gt;
&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;&lt;span style="color:blue;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;DbConnection&lt;/span&gt;&amp;nbsp;CreateConnectionWrapper(&lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;nbsp;nameOrConnectionString)
{ &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;providerInvariantName&amp;nbsp;=&amp;nbsp;&lt;span style="color:#a31515;"&gt;"System.Data.SqlClient"&lt;/span&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;connectionString&amp;nbsp;=&amp;nbsp;nameOrConnectionString;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:green;"&gt;//name=connectionName&amp;nbsp;format&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;index&amp;nbsp;=&amp;nbsp;nameOrConnectionString.IndexOf(&lt;span style="color:#a31515;"&gt;'='&lt;/span&gt;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;if&lt;/span&gt;&amp;nbsp;(index &amp;gt; 0 &amp;amp;&amp;amp;
nameOrConnectionString.Substring(0,&amp;nbsp;index).Trim() &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Equals(&lt;span style="color:#a31515;"&gt;"name"&lt;/span&gt;,&amp;nbsp;&lt;span style="color:#2b91af;"&gt;StringComparison&lt;/span&gt;.OrdinalIgnoreCase))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nameOrConnectionString&amp;nbsp;=&amp;nbsp;nameOrConnectionString
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Substring(index&amp;nbsp;+&amp;nbsp;1).Trim();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:green;"&gt;//look&amp;nbsp;up&amp;nbsp;connection&amp;nbsp;string&amp;nbsp;name&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;connectionStringSetting&amp;nbsp;=
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;ConfigurationManager&lt;/span&gt;.ConnectionStrings[nameOrConnectionString];
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;if&lt;/span&gt;&amp;nbsp;(connectionStringSetting&amp;nbsp;!=&amp;nbsp;&lt;span style="color:blue;"&gt;null&lt;/span&gt;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;providerInvariantName&amp;nbsp;=&amp;nbsp;connectionStringSetting.ProviderName;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;connectionString&amp;nbsp;=&amp;nbsp;connectionStringSetting.ConnectionString;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:green;"&gt;//create&amp;nbsp;the&amp;nbsp;special&amp;nbsp;connection&amp;nbsp;string&amp;nbsp;with&amp;nbsp;the&amp;nbsp;provider&amp;nbsp;name&amp;nbsp;in&amp;nbsp;it&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;wrappedConnectionString&amp;nbsp;=&amp;nbsp;&lt;span style="color:#a31515;"&gt;"wrappedProvider="&lt;/span&gt;&amp;nbsp;+&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;providerInvariantName&amp;nbsp;+&amp;nbsp;&lt;span style="color:#a31515;"&gt;";"&lt;/span&gt;&amp;nbsp;+&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;connectionString; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:green;"&gt;//create&amp;nbsp;the&amp;nbsp;tracing&amp;nbsp;wrapper&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;connection&amp;nbsp;=&amp;nbsp;&lt;span style="color:blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;EFTracingConnection&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ConnectionString&amp;nbsp;=&amp;nbsp;wrappedConnectionString
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;};
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:green;"&gt;//hook&amp;nbsp;up&amp;nbsp;logging&amp;nbsp;here&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;connection.CommandFinished&amp;nbsp;+=
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(sender,&amp;nbsp;args)&amp;nbsp;=&amp;gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(args.ToTraceString());
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;return&lt;/span&gt;&amp;nbsp;connection; }&lt;/pre&gt;This
should cope with connection strings in the 3 common forms ("Northwind", "name=Northwind"
and "Data Source=.\SQLEXPRESS;Initial Catalog=Northwind ...")&lt;br&gt;
&lt;br&gt;
Note the line to hook up logging (subscribing to the connection.CommandFinished event).
We could simply have used 
&lt;br&gt;
&lt;pre style="font-family: Consolas; font-size: 13px; color: black; background: none repeat scroll 0% 0% white;"&gt;&lt;span style="color:#2b91af;"&gt;EFTracingProviderConfiguration&lt;/span&gt;.LogToConsole&amp;nbsp;=&amp;nbsp;&lt;span style="color:blue;"&gt;true&lt;/span&gt;; 
&lt;br&gt;
&lt;/pre&gt;
&lt;p&gt;
Or you can hook up to log4net or EntLib logging to those tracing events. 
&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;br&gt;
&lt;/p&gt;
&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;
&lt;br&gt;
&lt;/pre&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://martinwilley.com/blog/aggbug.ashx?id=ce15092e-2857-450d-b20f-534afedd5d2f" /&gt;</description>
      <comments>http://martinwilley.com/blog/CommentView,guid,ce15092e-2857-450d-b20f-534afedd5d2f.aspx</comments>
      <category>.net 4</category>
      <category>Code First</category>
      <category>Entity Framework</category>
    </item>
    <item>
      <trackback:ping>http://martinwilley.com/blog/Trackback.aspx?guid=ca8c77fc-60bf-4cd1-b6f8-c75ddf6a378b</trackback:ping>
      <pingback:server>http://martinwilley.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://martinwilley.com/blog/PermaLink,guid,ca8c77fc-60bf-4cd1-b6f8-c75ddf6a378b.aspx</pingback:target>
      <dc:creator>Martin</dc:creator>
      <wfw:comment>http://martinwilley.com/blog/CommentView,guid,ca8c77fc-60bf-4cd1-b6f8-c75ddf6a378b.aspx</wfw:comment>
      <wfw:commentRss>http://martinwilley.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=ca8c77fc-60bf-4cd1-b6f8-c75ddf6a378b</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I wanted to use a many-to-many relationship using Entity Framework Code First (v4.1/4.2).
</p>
        <p>
Using pure code first such as this:
</p>
        <pre class="csharpcode">
          <span class="kwrd">using</span> (var context = <span class="kwrd">new</span> MyContext())
{ var employee = <span class="kwrd">new</span> Employee { FirstName = <span class="str">"Homer"</span>,
LastName = <span class="str">"Simpson"</span> }; var territory = <span class="kwrd">new</span> Territory
{ TerritoryDescription = <span class="str">"Springfield"</span> }; employee.Territories.Add(territory);
context.Employees.Add(employee); context.SaveChanges(); }</pre>
        <style type="text/css">


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
        <p>
results in a nice association table
</p>
        <p>
          <a href="http://www.martinwilley.com/blog/content/binary/EF-Code-First-Many-to-Many-Mapping_107AD/image.png">
            <img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.martinwilley.com/blog/content/binary/EF-Code-First-Many-to-Many-Mapping_107AD/image_thumb.png" width="244" height="180" />
          </a>
        </p>
        <p>
How do you map existing database tables? Like Northwind's customer to customer demographic
table relationship:
</p>
        <p>
          <a href="http://www.martinwilley.com/blog/content/binary/EF-Code-First-Many-to-Many-Mapping_107AD/image_3.png">
            <img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.martinwilley.com/blog/content/binary/EF-Code-First-Many-to-Many-Mapping_107AD/image_thumb_3.png" width="244" height="213" />
          </a>
        </p>
        <p>
This is the code I want to write:
</p>
        <pre class="csharpcode">
          <span class="kwrd">using</span> (var context = <span class="kwrd">new</span> MyContext(<span class="str">"name=Northwind"</span>))
{ var demo = <span class="kwrd">new</span> CustomerDemographic(); demo.CustomerTypeID
= <span class="str">"BERLIN"</span>; demo.CustomerDesc = <span class="str">"Berliner"</span>;
context.CustomerDemographics.Add(demo); <span class="rem">//link it to a customer
by either end</span> var alfki = context.Customers.Find(<span class="str">"ALFKI"</span>);
alfki.CustomerDemographics.Add(demo); context.SaveChanges(); }</pre>
        <style type="text/css">

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
        <p>
We have to override DbContext's OnModelCreating and add some mapping. For CodeFirst,
you map both sides of the relationship, so you can either put the mapping on Customer
or CustomerDemographic - or even both if the mappings agree. A normal foreign key
relationship is mapped with ".HasMany|HasOptional|HasRequired" followed by a ".WithMany|WithOptional|WithRequired". 
</p>
        <p>
So, from the CustomerDemographic entity, a many to many is just .HasMany(x=&gt;x.Customers).WithMany(z=&gt;z.CustomerDemographics).
</p>
        <p>
In addition, we don't have standard names for our association table so we add a .Map
element to specify the table and the left and right key columns. 
</p>
        <p>
Note the primary key of CustomerDemographics isn't the 'tableName'+"Id" convention
that Code First will expect. So I have to define the key for that. As we have that
end of the configuration, we'll define the mapping there.
</p>
        <p>
Here's the code.
</p>
        <pre class="csharpcode">modelBuilder.Entity&lt;CustomerDemographic&gt;()
    <span class="rem">//the
key isn't standard so specify it</span> .HasKey(x =&gt; x.CustomerTypeID) <span class="rem">//define
both sides of the relationship - HasMany.WithMany</span> .HasMany(x =&gt; x.Customers)
.WithMany(z =&gt; z.CustomerDemographics) <span class="rem">//specify mapping information</span> .Map(map
=&gt; { <span class="rem">//the association table name</span> map.ToTable(<span class="str">"CustomerCustomerDemo"</span>); <span class="rem">//the
left side (fk to CustomerDemographic, the entity we're defining)</span> map.MapLeftKey(<span class="str">"CustomerTypeID"</span>); <span class="rem">//the
right side (fk to Customers, the other side)</span> map.MapRightKey(<span class="str">"CustomerID"</span>);
} );</pre>
        <style type="text/css">

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
        <p>
If we mapped from the Customer entity, the HasMany and WithMany properties are different,
and the mapped left and right keys swap round.
</p>
        <p>
Here's the full DbContext for my mini-Northwind mapping:
</p>
        <pre class="csharpcode">
          <span class="kwrd">class</span> MyContext : DbContext { <span class="kwrd">public</span> MyContext(<span class="kwrd">string</span> connectionName)
: <span class="kwrd">base</span>(connectionName) { } <span class="kwrd">public</span> DbSet&lt;Employee&gt;
Employees { get; set; } <span class="kwrd">public</span> DbSet&lt;Territory&gt; Territories
{ get; set; } <span class="kwrd">public</span> DbSet&lt;Customer&gt; Customers { get;
set; } <span class="kwrd">public</span> DbSet&lt;CustomerDemographic&gt; CustomerDemographics
{ get; set; } <span class="kwrd">protected</span><span class="kwrd">override</span><span class="kwrd">void</span> OnModelCreating(DbModelBuilder
modelBuilder) { <span class="rem">//Database.SetInitializer(new DropCreateDatabaseIfModelChanges&lt;MyContext&gt;());</span> Database.SetInitializer&lt;MyContext&gt;(<span class="kwrd">null</span>);
modelBuilder.Conventions.Remove&lt;System.Data.Entity.Infrastructure.IncludeMetadataConvention&gt;();
modelBuilder.Entity&lt;CustomerDemographic&gt;() <span class="rem">//the key isn't
standard so specify it</span> .HasKey(x =&gt; x.CustomerTypeID) <span class="rem">//define
both sides of the relationship - HasMany.WithMany</span> .HasMany(x =&gt; x.Customers)
.WithMany(z =&gt; z.CustomerDemographics) <span class="rem">//specify mapping information</span> .Map(map
=&gt; { <span class="rem">//the association table name</span> map.ToTable(<span class="str">"CustomerCustomerDemo"</span>); <span class="rem">//the
left side (fk to CustomerDemographic, the entity we're defining)</span> map.MapLeftKey(<span class="str">"CustomerTypeID"</span>); <span class="rem">//the
right side (fk to Customers, the other side)</span> map.MapRightKey(<span class="str">"CustomerID"</span>);
} ); } }</pre>
        <style type="text/css">

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
        <img width="0" height="0" src="http://martinwilley.com/blog/aggbug.ashx?id=ca8c77fc-60bf-4cd1-b6f8-c75ddf6a378b" />
      </body>
      <title>EF Code First Many to Many Mapping</title>
      <guid isPermaLink="false">http://martinwilley.com/blog/PermaLink,guid,ca8c77fc-60bf-4cd1-b6f8-c75ddf6a378b.aspx</guid>
      <link>http://martinwilley.com/blog/2012/02/05/EFCodeFirstManyToManyMapping.aspx</link>
      <pubDate>Sun, 05 Feb 2012 20:42:13 GMT</pubDate>
      <description>&lt;p&gt;
I wanted to use a many-to-many relationship using Entity Framework Code First (v4.1/4.2).
&lt;/p&gt;
&lt;p&gt;
Using pure code first such as this:
&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; (var context = &lt;span class="kwrd"&gt;new&lt;/span&gt; MyContext())
{ var employee = &lt;span class="kwrd"&gt;new&lt;/span&gt; Employee { FirstName = &lt;span class="str"&gt;&amp;quot;Homer&amp;quot;&lt;/span&gt;,
LastName = &lt;span class="str"&gt;&amp;quot;Simpson&amp;quot;&lt;/span&gt; }; var territory = &lt;span class="kwrd"&gt;new&lt;/span&gt; Territory
{ TerritoryDescription = &lt;span class="str"&gt;&amp;quot;Springfield&amp;quot;&lt;/span&gt; }; employee.Territories.Add(territory);
context.Employees.Add(employee); context.SaveChanges(); }&lt;/pre&gt;
&lt;style type="text/css"&gt;


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;
&lt;p&gt;
results in a nice association table
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.martinwilley.com/blog/content/binary/EF-Code-First-Many-to-Many-Mapping_107AD/image.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.martinwilley.com/blog/content/binary/EF-Code-First-Many-to-Many-Mapping_107AD/image_thumb.png" width="244" height="180" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
How do you map existing database tables? Like Northwind's customer to customer demographic
table relationship:
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.martinwilley.com/blog/content/binary/EF-Code-First-Many-to-Many-Mapping_107AD/image_3.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.martinwilley.com/blog/content/binary/EF-Code-First-Many-to-Many-Mapping_107AD/image_thumb_3.png" width="244" height="213" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
This is the code I want to write:
&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; (var context = &lt;span class="kwrd"&gt;new&lt;/span&gt; MyContext(&lt;span class="str"&gt;&amp;quot;name=Northwind&amp;quot;&lt;/span&gt;))
{ var demo = &lt;span class="kwrd"&gt;new&lt;/span&gt; CustomerDemographic(); demo.CustomerTypeID
= &lt;span class="str"&gt;&amp;quot;BERLIN&amp;quot;&lt;/span&gt;; demo.CustomerDesc = &lt;span class="str"&gt;&amp;quot;Berliner&amp;quot;&lt;/span&gt;;
context.CustomerDemographics.Add(demo); &lt;span class="rem"&gt;//link it to a customer
by either end&lt;/span&gt; var alfki = context.Customers.Find(&lt;span class="str"&gt;&amp;quot;ALFKI&amp;quot;&lt;/span&gt;);
alfki.CustomerDemographics.Add(demo); context.SaveChanges(); }&lt;/pre&gt;
&lt;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;
&lt;p&gt;
We have to override DbContext's OnModelCreating and add some mapping. For CodeFirst,
you map both sides of the relationship, so you can either put the mapping on Customer
or CustomerDemographic - or even both if the mappings agree. A normal foreign key
relationship is mapped with ".HasMany|HasOptional|HasRequired" followed by a ".WithMany|WithOptional|WithRequired". 
&lt;/p&gt;
&lt;p&gt;
So, from the CustomerDemographic entity, a many to many is just .HasMany(x=&amp;gt;x.Customers).WithMany(z=&amp;gt;z.CustomerDemographics).
&lt;/p&gt;
&lt;p&gt;
In addition, we don't have standard names for our association table so we add a .Map
element to specify the table and the left and right key columns. 
&lt;/p&gt;
&lt;p&gt;
Note the primary key of CustomerDemographics isn't the 'tableName'+"Id" convention
that Code First will expect. So I have to define the key for that. As we have that
end of the configuration, we'll define the mapping there.
&lt;/p&gt;
&lt;p&gt;
Here's the code.
&lt;/p&gt;
&lt;pre class="csharpcode"&gt;modelBuilder.Entity&amp;lt;CustomerDemographic&amp;gt;()
    &lt;span class="rem"&gt;//the
key isn't standard so specify it&lt;/span&gt; .HasKey(x =&amp;gt; x.CustomerTypeID) &lt;span class="rem"&gt;//define
both sides of the relationship - HasMany.WithMany&lt;/span&gt; .HasMany(x =&amp;gt; x.Customers)
.WithMany(z =&amp;gt; z.CustomerDemographics) &lt;span class="rem"&gt;//specify mapping information&lt;/span&gt; .Map(map
=&amp;gt; { &lt;span class="rem"&gt;//the association table name&lt;/span&gt; map.ToTable(&lt;span class="str"&gt;&amp;quot;CustomerCustomerDemo&amp;quot;&lt;/span&gt;); &lt;span class="rem"&gt;//the
left side (fk to CustomerDemographic, the entity we're defining)&lt;/span&gt; map.MapLeftKey(&lt;span class="str"&gt;&amp;quot;CustomerTypeID&amp;quot;&lt;/span&gt;); &lt;span class="rem"&gt;//the
right side (fk to Customers, the other side)&lt;/span&gt; map.MapRightKey(&lt;span class="str"&gt;&amp;quot;CustomerID&amp;quot;&lt;/span&gt;);
} );&lt;/pre&gt;
&lt;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;
&lt;p&gt;
If we mapped from the Customer entity, the HasMany and WithMany properties are different,
and the mapped left and right keys swap round.
&lt;/p&gt;
&lt;p&gt;
Here's the full DbContext for my mini-Northwind mapping:
&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;class&lt;/span&gt; MyContext : DbContext { &lt;span class="kwrd"&gt;public&lt;/span&gt; MyContext(&lt;span class="kwrd"&gt;string&lt;/span&gt; connectionName)
: &lt;span class="kwrd"&gt;base&lt;/span&gt;(connectionName) { } &lt;span class="kwrd"&gt;public&lt;/span&gt; DbSet&amp;lt;Employee&amp;gt;
Employees { get; set; } &lt;span class="kwrd"&gt;public&lt;/span&gt; DbSet&amp;lt;Territory&amp;gt; Territories
{ get; set; } &lt;span class="kwrd"&gt;public&lt;/span&gt; DbSet&amp;lt;Customer&amp;gt; Customers { get;
set; } &lt;span class="kwrd"&gt;public&lt;/span&gt; DbSet&amp;lt;CustomerDemographic&amp;gt; CustomerDemographics
{ get; set; } &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; OnModelCreating(DbModelBuilder
modelBuilder) { &lt;span class="rem"&gt;//Database.SetInitializer(new DropCreateDatabaseIfModelChanges&amp;lt;MyContext&amp;gt;());&lt;/span&gt; Database.SetInitializer&amp;lt;MyContext&amp;gt;(&lt;span class="kwrd"&gt;null&lt;/span&gt;);
modelBuilder.Conventions.Remove&amp;lt;System.Data.Entity.Infrastructure.IncludeMetadataConvention&amp;gt;();
modelBuilder.Entity&amp;lt;CustomerDemographic&amp;gt;() &lt;span class="rem"&gt;//the key isn't
standard so specify it&lt;/span&gt; .HasKey(x =&amp;gt; x.CustomerTypeID) &lt;span class="rem"&gt;//define
both sides of the relationship - HasMany.WithMany&lt;/span&gt; .HasMany(x =&amp;gt; x.Customers)
.WithMany(z =&amp;gt; z.CustomerDemographics) &lt;span class="rem"&gt;//specify mapping information&lt;/span&gt; .Map(map
=&amp;gt; { &lt;span class="rem"&gt;//the association table name&lt;/span&gt; map.ToTable(&lt;span class="str"&gt;&amp;quot;CustomerCustomerDemo&amp;quot;&lt;/span&gt;); &lt;span class="rem"&gt;//the
left side (fk to CustomerDemographic, the entity we're defining)&lt;/span&gt; map.MapLeftKey(&lt;span class="str"&gt;&amp;quot;CustomerTypeID&amp;quot;&lt;/span&gt;); &lt;span class="rem"&gt;//the
right side (fk to Customers, the other side)&lt;/span&gt; map.MapRightKey(&lt;span class="str"&gt;&amp;quot;CustomerID&amp;quot;&lt;/span&gt;);
} ); } }&lt;/pre&gt;
&lt;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;
&lt;img width="0" height="0" src="http://martinwilley.com/blog/aggbug.ashx?id=ca8c77fc-60bf-4cd1-b6f8-c75ddf6a378b" /&gt;</description>
      <comments>http://martinwilley.com/blog/CommentView,guid,ca8c77fc-60bf-4cd1-b6f8-c75ddf6a378b.aspx</comments>
      <category>.net 4</category>
      <category>Code First</category>
      <category>Entity Framework</category>
    </item>
    <item>
      <trackback:ping>http://martinwilley.com/blog/Trackback.aspx?guid=14db91d2-0338-4ad9-bbd5-a916cccce5be</trackback:ping>
      <pingback:server>http://martinwilley.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://martinwilley.com/blog/PermaLink,guid,14db91d2-0338-4ad9-bbd5-a916cccce5be.aspx</pingback:target>
      <dc:creator>Martin</dc:creator>
      <wfw:comment>http://martinwilley.com/blog/CommentView,guid,14db91d2-0338-4ad9-bbd5-a916cccce5be.aspx</wfw:comment>
      <wfw:commentRss>http://martinwilley.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=14db91d2-0338-4ad9-bbd5-a916cccce5be</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I've just done all 4 of the exams for .Net 4.0 MCPD Web Developer. Overall, I quite
enjoyed it. I even learned a bit. 
</p>
        <p>
Programmer certifications, and particularly the Microsoft ones, get a lot of criticism.
In theory they prove someone is proficient in the technology. In practice, by itself
a certificate is unreliable. 
</p>
        <p>
Microsoft's Partner program insists that companies have staff with certifications.
The body shops put their new recruits through a brief course so they can pass and
then be sold on. Often, they memorised the questions and answers from internet dumps.
It's disappointing to google the exam codes: apart from the Microsoft syllabus, every
link is a site selling the answers. 
</p>
        <p>
If you're a consultant, or you're going to change jobs, experienced programmers probably
have to do the exams too. If you work for a Microsoft Partner you have to do it, and
HR departments filter their CVs using it. Really, the best measure of proficiency
is years of experience and types of projects. That's real-world practical knowledge.
Okay, I would say that, having been doing this for 25 years. But, as the company I
work for needs the certificate points, and they're paying, I'm happy to do the exams.
</p>
        <p>
For .net 1 we had to do exams for ASP, windows forms and web services, but most .net
programmers then only worked in one or two of those- certainly never windows forms
and ASP. I was actually quite impressed by the .Net 2 foundation exam, which covered
a lot of basics: collections, threads, tracing, serialization, globalization, encryption.
Specific projects may not involve some of it, but a good .net programmer should know
almost all of it (even if you have to google the details). Unfortunately they dropped
it for .Net 4, going back to technology areas (asp, web services) just like the original
.net 1 exams.  Now for .net 4 "web" we have asp, wcf and data access (ado/entity
framework). Broadly I agree you'd expect all web developers to know those topics,
so that's not too bad. 
</p>
        <p>
One big problem with certification questions is that they pick on obscure APIs and
ASP controls. Now, questions on the validation controls is probably a good basic requirement,
but frankly the gridview events are a nightmare anyway, so memorizing them for an
exam is painful. The .net 4 asp exam wasn't too bad although there was some API questions
that in real life you'd just google. One of the jQuery questions annoyed me too, using
an unusual API detail (I think an older syntax) when they could have used a better,
clearer replacement.
</p>
        <p>
The older exams had sections devoted to things nobody ever uses. On the asp .net 2
exam it was mobile controls, and web parts (cloned from Sharepoint, and never used
outside Sharepoint). Fortunately there seems less of that in the .net 4 exams, although
there's still some asp ajax library stuff in there, plus some dynamic data. The big
problem was that jQuery and MVC have moved on since the exam was written. All the
questions were about MVC 2, not 3. It's not that the questions were obsolete (there
was nothing much about webform views to confuse those who use Razor), it's just that
the pace of change is making exams less relevant. 
</p>
        <p>
The other exams had little used topics too. The WCF exam covered MSMQ, which I've
never seen used in real life. The data access exam was more problematic. Basic ADO
is useful, but there was still material about little used dataset features like constraints
and dataRelations. There was not much on Linq2Sql, perhaps just as well, but most
of the exam was Entity Framework. I know EF is used out there, but I've yet to encounter
EF and it seems to be in second place to NHibernate at least for ORM data access.
So I did learn something for this exam, and yes, I passed the exam as a novice with
no real world experience of Entity Framework. On the other hand, as an experienced
programmer I'd feel comfortable doing EF (even if I'd rather be doing NHibernate.)
</p>
        <p>
Two of the exams - the WCF and the ASP Pro exam - had "testlets" with a case study
and a small number of questions about the scenario. The WCF was over-elaborate, with
source listings and xml, but for all that I thought it was a little more realistic
and actually quite enjoyable. 
</p>
        <p>
To study, I used the Microsoft Training Kit books, MSDN and for the areas I was less
familiar with - mostly EF and some aspects of WCF - a little practice. The WCF exam
didn't have a book, so I had to use the .net 3.5 one and look up a couple of subjects
(routing and discovery). I skimmed the bits I knew well (the asp/ web side generally).
Generally I found you needed a bit more knowledge than was in the books, but only
a few things were really obscure. Overall, studying for the exam was interesting and
useful. Learning about WCF routing and discovery and EF, things I haven't actually
used, did bring me more up-to-date with the .net 4 stack. 
<br /></p>
        <p>
A pity Microsoft's "congratulations" email contains a link to a blog that closed 2
years ago. 
<br /></p>
        <img width="0" height="0" src="http://martinwilley.com/blog/aggbug.ashx?id=14db91d2-0338-4ad9-bbd5-a916cccce5be" />
      </body>
      <title>MCPD Web Developer .Net 4</title>
      <guid isPermaLink="false">http://martinwilley.com/blog/PermaLink,guid,14db91d2-0338-4ad9-bbd5-a916cccce5be.aspx</guid>
      <link>http://martinwilley.com/blog/2011/12/10/MCPDWebDeveloperNet4.aspx</link>
      <pubDate>Sat, 10 Dec 2011 21:15:55 GMT</pubDate>
      <description>&lt;p&gt;
I've just done all 4 of the exams for .Net 4.0 MCPD Web Developer. Overall, I quite
enjoyed it. I even learned a bit. 
&lt;/p&gt;
&lt;p&gt;
Programmer certifications, and particularly the Microsoft ones, get a lot of criticism.
In theory they prove someone is proficient in the technology. In practice, by itself
a certificate is unreliable. 
&lt;/p&gt;
&lt;p&gt;
Microsoft's Partner program insists that companies have staff with certifications.
The body shops put their new recruits through a brief course so they can pass and
then be sold on. Often, they memorised the questions and answers from internet dumps.
It's disappointing to google the exam codes: apart from the Microsoft syllabus, every
link is a site selling the answers. 
&lt;/p&gt;
&lt;p&gt;
If you're a consultant, or you're going to change jobs, experienced programmers probably
have to do the exams too. If you work for a Microsoft Partner you have to do it, and
HR departments filter their CVs using it. Really, the best measure of proficiency
is years of experience and types of projects. That's real-world practical knowledge.
Okay, I would say that, having been doing this for 25 years. But, as the company I
work for needs the certificate points, and they're paying, I'm happy to do the exams.
&lt;/p&gt;
&lt;p&gt;
For .net 1 we had to do exams for ASP, windows forms and web services, but most .net
programmers then only worked in one or two of those- certainly never windows forms
and ASP. I was actually quite impressed by the .Net 2 foundation exam, which covered
a lot of basics: collections, threads, tracing, serialization, globalization, encryption.
Specific projects may not involve some of it, but a good .net programmer should know
almost all of it (even if you have to google the details). Unfortunately they dropped
it for .Net 4, going back to technology areas (asp, web services) just like the original
.net 1 exams.&amp;nbsp; Now for .net 4 "web" we have asp, wcf and data access (ado/entity
framework). Broadly I agree you'd expect all web developers to know those topics,
so that's not too bad. 
&lt;/p&gt;
&lt;p&gt;
One big problem with certification questions is that they pick on obscure APIs and
ASP controls. Now, questions on the validation controls is probably a good basic requirement,
but frankly the gridview events are a nightmare anyway, so memorizing them for an
exam is painful. The .net 4 asp exam wasn't too bad although there was some API questions
that in real life you'd just google. One of the jQuery questions annoyed me too, using
an unusual API detail (I think an older syntax) when they could have used a better,
clearer replacement.
&lt;/p&gt;
&lt;p&gt;
The older exams had sections devoted to things nobody ever uses. On the asp .net 2
exam it was mobile controls, and web parts (cloned from Sharepoint, and never used
outside Sharepoint). Fortunately there seems less of that in the .net 4 exams, although
there's still some asp ajax library stuff in there, plus some dynamic data. The big
problem was that jQuery and MVC have moved on since the exam was written. All the
questions were about MVC 2, not 3. It's not that the questions were obsolete (there
was nothing much about webform views to confuse those who use Razor), it's just that
the pace of change is making exams less relevant. 
&lt;/p&gt;
&lt;p&gt;
The other exams had little used topics too. The WCF exam covered MSMQ, which I've
never seen used in real life. The data access exam was more problematic. Basic ADO
is useful, but there was still material about little used dataset features like constraints
and dataRelations. There was not much on Linq2Sql, perhaps just as well, but most
of the exam was Entity Framework. I know EF is used out there, but I've yet to encounter
EF and it seems to be in second place to NHibernate at least for ORM data access.
So I did learn something for this exam, and yes, I passed the exam as a novice with
no real world experience of Entity Framework. On the other hand, as an experienced
programmer I'd feel comfortable doing EF (even if I'd rather be doing NHibernate.)
&lt;/p&gt;
&lt;p&gt;
Two of the exams - the WCF and the ASP Pro exam - had "testlets" with a case study
and a small number of questions about the scenario. The WCF was over-elaborate, with
source listings and xml, but for all that I thought it was a little more realistic
and actually quite enjoyable. 
&lt;/p&gt;
&lt;p&gt;
To study, I used the Microsoft Training Kit books, MSDN and for the areas I was less
familiar with - mostly EF and some aspects of WCF - a little practice. The WCF exam
didn't have a book, so I had to use the .net 3.5 one and look up a couple of subjects
(routing and discovery). I skimmed the bits I knew well (the asp/ web side generally).
Generally I found you needed a bit more knowledge than was in the books, but only
a few things were really obscure. Overall, studying for the exam was interesting and
useful. Learning about WCF routing and discovery and EF, things I haven't actually
used, did bring me more up-to-date with the .net 4 stack. 
&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;
A pity Microsoft's "congratulations" email contains a link to a blog that closed 2
years ago. 
&lt;br&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://martinwilley.com/blog/aggbug.ashx?id=14db91d2-0338-4ad9-bbd5-a916cccce5be" /&gt;</description>
      <comments>http://martinwilley.com/blog/CommentView,guid,14db91d2-0338-4ad9-bbd5-a916cccce5be.aspx</comments>
      <category>.net 4</category>
      <category>VS2010</category>
    </item>
    <item>
      <trackback:ping>http://martinwilley.com/blog/Trackback.aspx?guid=1fa03e20-76dc-4241-b343-74eb6c71e62f</trackback:ping>
      <pingback:server>http://martinwilley.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://martinwilley.com/blog/PermaLink,guid,1fa03e20-76dc-4241-b343-74eb6c71e62f.aspx</pingback:target>
      <dc:creator>Martin</dc:creator>
      <georss:point>0 0</georss:point>
      <wfw:comment>http://martinwilley.com/blog/CommentView,guid,1fa03e20-76dc-4241-b343-74eb6c71e62f.aspx</wfw:comment>
      <wfw:commentRss>http://martinwilley.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=1fa03e20-76dc-4241-b343-74eb6c71e62f</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">A brief recap of ASP.Net cache:<br /><br /><pre style="font-family:Consolas;font-size:13;color:black;background:white;"><span style="color:green;">//in MVC use HttpRuntime.Cache or HttpContext.Cache</span><span style="color:green;">//in webforms Application is the original cache without expiration rules</span><span style="color:blue;">var</span> category = <span style="color:#2b91af;">HttpRuntime</span>.Cache[<span style="color:#a31515;">"Category"</span>] <span style="color:blue;">as</span> <span style="color:#2b91af;">CategoryModel</span>; <span style="color:blue;">if</span> (category == <span style="color:blue;">null</span>)
{      category = _dataAccess.Find(1);      <span style="color:#2b91af;">HttpRuntime</span>.Cache[<span style="color:#a31515;">"Category"</span>] = category;
     <span style="color:green;">// ...or...</span>      <span style="color:green;">//monitor some files and/or other cache items</span>      <span style="color:blue;">var</span> cd = <span style="color:blue;">new</span> <span style="color:#2b91af;">CacheDependency</span>(<span style="color:blue;">new</span>[] { <span style="color:#a31515;">@"C:\triggerFolder\"</span> }, <span style="color:blue;">new</span>[] { <span style="color:#a31515;">"OtherCacheItem"</span> });
     <span style="color:#2b91af;">HttpRuntime</span>.Cache.Insert(<span style="color:#a31515;">"Category1"</span>, category, 
              
cd, <span style="color:green;">//dependencies or null</span>                <span style="color:#2b91af;">DateTime</span>.Now.AddMinutes(5), <span style="color:green;">//absolute expiration (or Cache.NoAbsoluteExporation)</span>              <span style="color:#2b91af;">Cache</span>.NoSlidingExpiration <span style="color:green;">//sliding expiration (timespan)</span>     
); }</pre>Mocking this in tests (especially for MVC) is a bit ugly (.Net 3.5sp1 has
System.Web.Abstractions including HttpContextBase, but caching isn't included)<br /><br />
Now in .Net 4 we can reference <a href="http://msdn.microsoft.com/en-us/library/dd985642.aspx">System.Runtime.Caching</a>.dll.
And the really nice thing is this will run outside Asp.Net.<br /><pre style="font-family:Consolas;font-size:13;color:black;background:white;"><span style="color:green;">//get the static "default" cache. You can have multiple named caches.</span><span style="color:#2b91af;">ObjectCache</span> cache = <span style="color:#2b91af;">MemoryCache</span>.Default; <span style="color:green;">//you can't store null in the cache</span><span style="color:blue;">var</span> category = cache[<span style="color:#a31515;">"Category"</span>] <span style="color:blue;">as</span> <span style="color:#2b91af;">CategoryModel</span>; <span style="color:blue;">if</span> (category == <span style="color:blue;">null</span>)
{     category = _dataAccess.Find(1);     cache[<span style="color:#a31515;">"Category"</span>] = category;
    <span style="color:green;">// ...or...</span>     <span style="color:blue;">var</span> policy = <span style="color:blue;">new</span> <span style="color:#2b91af;">CacheItemPolicy</span>();
    policy.AbsoluteExpiration = <span style="color:#2b91af;">DateTime</span>.Now.AddMinutes(5);
    <span style="color:green;">//monitor some files and/or other cache items</span>     policy.ChangeMonitors.Add(
        <span style="color:blue;">new</span> <span style="color:#2b91af;">HostFileChangeMonitor</span>(<span style="color:blue;">new</span> <span style="color:#2b91af;">List</span>&lt;<span style="color:blue;">string</span>&gt; { <span style="color:#a31515;">@"C:\triggerFolder\"</span>})
        );     <span style="color:green;">//synchronize with another cache item</span>     policy.ChangeMonitors.Add(
        cache.CreateCacheEntryChangeMonitor(<span style="color:blue;">new</span> [] { <span style="color:#a31515;">"OtherCacheItem"</span>})
        );     cache.Add(<span style="color:#a31515;">"Category1"</span>, category, policy);
} </pre>For simple caching (no change monitors) you don't even need mocking in your
tests - in fact, you can test your caching with a real cache. You can move caching
down into your library classes that may be called from web pages, tests, WPF apps
and consoles.<br /><br /><br /><br /><p></p><img width="0" height="0" src="http://martinwilley.com/blog/aggbug.ashx?id=1fa03e20-76dc-4241-b343-74eb6c71e62f" /></body>
      <title>.Net 4.0 Caching - not just for Asp</title>
      <guid isPermaLink="false">http://martinwilley.com/blog/PermaLink,guid,1fa03e20-76dc-4241-b343-74eb6c71e62f.aspx</guid>
      <link>http://martinwilley.com/blog/2011/07/08/Net40CachingNotJustForAsp.aspx</link>
      <pubDate>Fri, 08 Jul 2011 08:57:57 GMT</pubDate>
      <description>A brief recap of ASP.Net cache:&lt;br&gt;
&lt;br&gt;
&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;&lt;span style="color:green;"&gt;//in&amp;nbsp;MVC&amp;nbsp;use&amp;nbsp;HttpRuntime.Cache&amp;nbsp;or&amp;nbsp;HttpContext.Cache&lt;/span&gt; &lt;span style="color:green;"&gt;//in&amp;nbsp;webforms&amp;nbsp;Application&amp;nbsp;is&amp;nbsp;the&amp;nbsp;original&amp;nbsp;cache&amp;nbsp;without&amp;nbsp;expiration&amp;nbsp;rules&lt;/span&gt; &lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;category&amp;nbsp;=&amp;nbsp;&lt;span style="color:#2b91af;"&gt;HttpRuntime&lt;/span&gt;.Cache[&lt;span style="color:#a31515;"&gt;"Category"&lt;/span&gt;]&amp;nbsp;&lt;span style="color:blue;"&gt;as&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;CategoryModel&lt;/span&gt;; &lt;span style="color:blue;"&gt;if&lt;/span&gt;&amp;nbsp;(category&amp;nbsp;==&amp;nbsp;&lt;span style="color:blue;"&gt;null&lt;/span&gt;)
{ &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; category&amp;nbsp;=&amp;nbsp;_dataAccess.Find(1); &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;HttpRuntime&lt;/span&gt;.Cache[&lt;span style="color:#a31515;"&gt;"Category"&lt;/span&gt;]&amp;nbsp;=&amp;nbsp;category;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;//&amp;nbsp;...or...&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;//monitor&amp;nbsp;some&amp;nbsp;files&amp;nbsp;and/or&amp;nbsp;other&amp;nbsp;cache&amp;nbsp;items&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;cd&amp;nbsp;=&amp;nbsp;&lt;span style="color:blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;CacheDependency&lt;/span&gt;(&lt;span style="color:blue;"&gt;new&lt;/span&gt;[]&amp;nbsp;{&amp;nbsp;&lt;span style="color:#a31515;"&gt;@"C:\triggerFolder\"&lt;/span&gt;&amp;nbsp;},&amp;nbsp;&lt;span style="color:blue;"&gt;new&lt;/span&gt;[]&amp;nbsp;{&amp;nbsp;&lt;span style="color:#a31515;"&gt;"OtherCacheItem"&lt;/span&gt;&amp;nbsp;});
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;HttpRuntime&lt;/span&gt;.Cache.Insert(&lt;span style="color:#a31515;"&gt;"Category1"&lt;/span&gt;,&amp;nbsp;category,&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
cd,&amp;nbsp;&lt;span style="color:green;"&gt;//dependencies&amp;nbsp;or&amp;nbsp;null&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;DateTime&lt;/span&gt;.Now.AddMinutes(5),&amp;nbsp;&lt;span style="color:green;"&gt;//absolute&amp;nbsp;expiration&amp;nbsp;(or&amp;nbsp;Cache.NoAbsoluteExporation)&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;Cache&lt;/span&gt;.NoSlidingExpiration&amp;nbsp;&lt;span style="color:green;"&gt;//sliding&amp;nbsp;expiration&amp;nbsp;(timespan)&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
); }&lt;/pre&gt;Mocking this in tests (especially for MVC) is a bit ugly (.Net 3.5sp1 has
System.Web.Abstractions including HttpContextBase, but caching isn't included)&lt;br&gt;
&lt;br&gt;
Now in .Net 4 we can reference &lt;a href="http://msdn.microsoft.com/en-us/library/dd985642.aspx"&gt;System.Runtime.Caching&lt;/a&gt;.dll.
And the really nice thing is this will run outside Asp.Net.&lt;br&gt;
&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;&lt;span style="color:green;"&gt;//get&amp;nbsp;the&amp;nbsp;static&amp;nbsp;"default"&amp;nbsp;cache.&amp;nbsp;You&amp;nbsp;can&amp;nbsp;have&amp;nbsp;multiple&amp;nbsp;named&amp;nbsp;caches.&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ObjectCache&lt;/span&gt;&amp;nbsp;cache&amp;nbsp;=&amp;nbsp;&lt;span style="color:#2b91af;"&gt;MemoryCache&lt;/span&gt;.Default; &lt;span style="color:green;"&gt;//you&amp;nbsp;can't&amp;nbsp;store&amp;nbsp;null&amp;nbsp;in&amp;nbsp;the&amp;nbsp;cache&lt;/span&gt; &lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;category&amp;nbsp;=&amp;nbsp;cache[&lt;span style="color:#a31515;"&gt;"Category"&lt;/span&gt;]&amp;nbsp;&lt;span style="color:blue;"&gt;as&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;CategoryModel&lt;/span&gt;; &lt;span style="color:blue;"&gt;if&lt;/span&gt;&amp;nbsp;(category&amp;nbsp;==&amp;nbsp;&lt;span style="color:blue;"&gt;null&lt;/span&gt;)
{ &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;category&amp;nbsp;=&amp;nbsp;_dataAccess.Find(1); &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cache[&lt;span style="color:#a31515;"&gt;"Category"&lt;/span&gt;]&amp;nbsp;=&amp;nbsp;category;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:green;"&gt;//&amp;nbsp;...or...&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;policy&amp;nbsp;=&amp;nbsp;&lt;span style="color:blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;CacheItemPolicy&lt;/span&gt;();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;policy.AbsoluteExpiration&amp;nbsp;=&amp;nbsp;&lt;span style="color:#2b91af;"&gt;DateTime&lt;/span&gt;.Now.AddMinutes(5);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:green;"&gt;//monitor&amp;nbsp;some&amp;nbsp;files&amp;nbsp;and/or&amp;nbsp;other&amp;nbsp;cache&amp;nbsp;items&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;policy.ChangeMonitors.Add(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;HostFileChangeMonitor&lt;/span&gt;(&lt;span style="color:blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;gt;&amp;nbsp;{&amp;nbsp;&lt;span style="color:#a31515;"&gt;@"C:\triggerFolder\"&lt;/span&gt;})
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;); &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:green;"&gt;//synchronize&amp;nbsp;with&amp;nbsp;another&amp;nbsp;cache&amp;nbsp;item&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;policy.ChangeMonitors.Add(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cache.CreateCacheEntryChangeMonitor(&lt;span style="color:blue;"&gt;new&lt;/span&gt;&amp;nbsp;[]&amp;nbsp;{&amp;nbsp;&lt;span style="color:#a31515;"&gt;"OtherCacheItem"&lt;/span&gt;})
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;); &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cache.Add(&lt;span style="color:#a31515;"&gt;"Category1"&lt;/span&gt;,&amp;nbsp;category,&amp;nbsp;policy);
} &lt;/pre&gt;For simple caching (no change monitors) you don't even need mocking in your
tests - in fact, you can test your caching with a real cache. You can move caching
down into your library classes that may be called from web pages, tests, WPF apps
and consoles.&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://martinwilley.com/blog/aggbug.ashx?id=1fa03e20-76dc-4241-b343-74eb6c71e62f" /&gt;</description>
      <comments>http://martinwilley.com/blog/CommentView,guid,1fa03e20-76dc-4241-b343-74eb6c71e62f.aspx</comments>
      <category>.net 4</category>
    </item>
    <item>
      <trackback:ping>http://martinwilley.com/blog/Trackback.aspx?guid=156ef515-1762-4604-84b9-d1213b895b03</trackback:ping>
      <pingback:server>http://martinwilley.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://martinwilley.com/blog/PermaLink,guid,156ef515-1762-4604-84b9-d1213b895b03.aspx</pingback:target>
      <dc:creator>Martin</dc:creator>
      <georss:point>0 0</georss:point>
      <wfw:comment>http://martinwilley.com/blog/CommentView,guid,156ef515-1762-4604-84b9-d1213b895b03.aspx</wfw:comment>
      <wfw:commentRss>http://martinwilley.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=156ef515-1762-4604-84b9-d1213b895b03</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">T4 preprocessed templates are a neat way
of generating text at run time, which can be deployed to machines without Visual Studio.
Here's <a href="http://msdn.microsoft.com/en-us/library/ee844259.aspx">MSDN</a><br /><br />
Here's a simple template, ClassWriter.tt, which must be marked CustomTool = "<b>TextTemplatingFilePreprocessor</b>"
in properties (not "<b>TextTemplatingFileGenerator</b>" which is a normal T4).<br /><pre style="font-family:Consolas;font-size:13;color:black;background:white;"><span style="background:gold;">&lt;#@</span> <span style="color:maroon;">template</span> <span style="color:maroon;">language</span><span style="color:gray;">=</span><span style="color:blue;">"C#"</span> <span style="background:gold;">#&gt;</span><span style="background:gold;">&lt;#@</span> <span style="color:maroon;">import</span> <span style="color:maroon;">namespace</span><span style="color:gray;">=</span><span style="color:blue;">"System.Linq"</span> <span style="background:gold;">#&gt;</span><span style="background:gold;">&lt;#@</span> <span style="color:maroon;">parameter</span> <span style="color:maroon;">type</span><span style="color:gray;">=</span><span style="color:blue;">"Generator.Model.Table"</span> <span style="color:maroon;">name</span><span style="color:gray;">=</span><span style="color:blue;">"table"</span> <span style="background:gold;">#&gt;</span><span style="color:gray;">using System;</span><span style="color:gray;">namespace </span><span style="background:gold;">&lt;#=</span> table.Namespace <span style="background:gold;">#&gt;</span><span style="color:gray;">{</span><span style="color:gray;">    [Serializable]</span><span style="color:gray;">    public class </span><span style="background:gold;">&lt;#=</span> table.Name <span style="background:gold;">#&gt;</span><span style="color:gray;">    {</span><span style="background:gold;">&lt;#</span>  <span style="color:blue;">foreach</span>(<span style="color:blue;">var</span> column <span style="color:blue;">in</span> table.Columns.Where(c=&gt; !c.Hidden)) { <span style="background:gold;">#&gt;</span><span style="color:gray;">        public virtual </span><span style="background:gold;">&lt;#=</span> column.Type <span style="background:gold;">#&gt;</span><span style="color:gray;"> </span><span style="background:gold;">&lt;#=</span> column.Name <span style="background:gold;">#&gt;</span><span style="color:gray;"> { get; set; }</span><span style="background:gold;">&lt;#</span>    } <span style="background:gold;">#&gt;</span><span style="color:gray;">    }</span><span style="color:gray;">}</span></pre><br />
At development time, Visual Studio generates the class in the corresponding namespace
which you can then call (yeah, it generates code for generating code...). 
<br /><br />
Notice we're passing a parameter, which has to have the full namespaced name (even
"string" has to be "System.String"). 
<br /><br />
The generated class is partial and the parameters are property getters with a backing
field. MSDN suggests that to pass in your parameters you should manually code a partial
class with conventional properties or a constructor. Actually, there's an easier no-code
way. Use the Session property (which is just a Dictionary&lt;string, object&gt;) which
you can use with an Initialize() method. Like this:<br /><br /><pre style="font-family:Consolas;font-size:13;color:black;background:white;"><span style="color:green;">//create the class generated by TextTemplatingFilePreprocessor </span><span style="color:blue;">var</span> generator = <span style="color:blue;">new</span> <span style="color:#2b91af;">ClassWriter</span>(); <span style="color:green;">//create a session dictionary, fill it and initialize</span> generator.Session = <span style="color:blue;">new</span> <span style="color:#2b91af;">Dictionary</span>&lt;<span style="color:blue;">string</span>, <span style="color:blue;">object</span>&gt;();
generator.Session.Add(<span style="color:#a31515;">"table"</span>, table); generator.Initialize(); <span style="color:green;">//transform!</span><span style="color:blue;">var</span> text = generator.TransformText();</pre>The
key things to watch out for: 
<br /><ul><li>
you must create the Session dictionary (it's not initialized internally)</li><li>
you must call Initialize() after it's populated.</li></ul><br />
You can also use System.Runtime.Remoting.Messaging.CallContext but weirdly you must
still initialize the Session dictionary (Initialize checks Session first, then CallContext).<br />
 <br />
You may be tempted to reuse the T4 template class like this.<br /><pre style="font-family:Consolas;font-size:13;color:black;background:white;"><span style="color:green;">//don't do this</span><span style="color:blue;">var</span> generator = <span style="color:blue;">new</span> <span style="color:#2b91af;">ClassWriter</span>(); <span style="color:blue;">foreach</span> (<span style="color:blue;">var</span> item <span style="color:blue;">in</span> list)
{     generator.Session = <span style="color:blue;">new</span> <span style="color:#2b91af;">Dictionary</span>&lt;<span style="color:blue;">string</span>, <span style="color:blue;">object</span>&gt;();
    generator.Session.Add(<span style="color:#a31515;">"table"</span>, item);
    generator.Initialize();     <span style="color:blue;">var</span> txt = generator.TransformText();
    WriteText(item, txt); }</pre>The template class actually
uses an internal StringBuilder called GenerationEnvironment. So each call returns
everything you wrote before. You can't actually reset the StringBuilder (although
you can append to it with Write overloads). So, always create the template class <i>within </i>the
loop.<br /><br /><br /><br /><p></p><img width="0" height="0" src="http://martinwilley.com/blog/aggbug.ashx?id=156ef515-1762-4604-84b9-d1213b895b03" /></body>
      <title>T4 preprocessing</title>
      <guid isPermaLink="false">http://martinwilley.com/blog/PermaLink,guid,156ef515-1762-4604-84b9-d1213b895b03.aspx</guid>
      <link>http://martinwilley.com/blog/2011/06/10/T4Preprocessing.aspx</link>
      <pubDate>Fri, 10 Jun 2011 11:50:55 GMT</pubDate>
      <description>T4 preprocessed templates are a neat way of generating text at run time, which can be deployed to machines without Visual Studio. Here's &lt;a href="http://msdn.microsoft.com/en-us/library/ee844259.aspx"&gt;MSDN&lt;/a&gt;
&lt;br&gt;
&lt;br&gt;
Here's a simple template, ClassWriter.tt, which must be marked CustomTool = "&lt;b&gt;TextTemplatingFilePreprocessor&lt;/b&gt;"
in properties (not "&lt;b&gt;TextTemplatingFileGenerator&lt;/b&gt;" which is a normal T4).&lt;br&gt;
&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;&lt;span style="background:gold;"&gt;&amp;lt;#@&lt;/span&gt;&amp;nbsp;&lt;span style="color:maroon;"&gt;template&lt;/span&gt;&amp;nbsp;&lt;span style="color:maroon;"&gt;language&lt;/span&gt;&lt;span style="color:gray;"&gt;=&lt;/span&gt;&lt;span style="color:blue;"&gt;"C#"&lt;/span&gt;&amp;nbsp;&lt;span style="background:gold;"&gt;#&amp;gt;&lt;/span&gt; &lt;span style="background:gold;"&gt;&amp;lt;#@&lt;/span&gt;&amp;nbsp;&lt;span style="color:maroon;"&gt;import&lt;/span&gt;&amp;nbsp;&lt;span style="color:maroon;"&gt;namespace&lt;/span&gt;&lt;span style="color:gray;"&gt;=&lt;/span&gt;&lt;span style="color:blue;"&gt;"System.Linq"&lt;/span&gt;&amp;nbsp;&lt;span style="background:gold;"&gt;#&amp;gt;&lt;/span&gt; &lt;span style="background:gold;"&gt;&amp;lt;#@&lt;/span&gt;&amp;nbsp;&lt;span style="color:maroon;"&gt;parameter&lt;/span&gt;&amp;nbsp;&lt;span style="color:maroon;"&gt;type&lt;/span&gt;&lt;span style="color:gray;"&gt;=&lt;/span&gt;&lt;span style="color:blue;"&gt;"Generator.Model.Table"&lt;/span&gt;&amp;nbsp;&lt;span style="color:maroon;"&gt;name&lt;/span&gt;&lt;span style="color:gray;"&gt;=&lt;/span&gt;&lt;span style="color:blue;"&gt;"table"&lt;/span&gt;&amp;nbsp;&lt;span style="background:gold;"&gt;#&amp;gt;&lt;/span&gt; &lt;span style="color:gray;"&gt;using&amp;nbsp;System;&lt;/span&gt; &lt;span style="color:gray;"&gt;namespace&amp;nbsp;&lt;/span&gt;&lt;span style="background:gold;"&gt;&amp;lt;#=&lt;/span&gt;&amp;nbsp;table.Namespace&amp;nbsp;&lt;span style="background:gold;"&gt;#&amp;gt;&lt;/span&gt; &lt;span style="color:gray;"&gt;{&lt;/span&gt; &lt;span style="color:gray;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[Serializable]&lt;/span&gt; &lt;span style="color:gray;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;class&amp;nbsp;&lt;/span&gt;&lt;span style="background:gold;"&gt;&amp;lt;#=&lt;/span&gt;&amp;nbsp;table.Name&amp;nbsp;&lt;span style="background:gold;"&gt;#&amp;gt;&lt;/span&gt; &lt;span style="color:gray;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/span&gt; &lt;span style="background:gold;"&gt;&amp;lt;#&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;foreach&lt;/span&gt;(&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;column&amp;nbsp;&lt;span style="color:blue;"&gt;in&lt;/span&gt;&amp;nbsp;table.Columns.Where(c=&amp;gt;&amp;nbsp;!c.Hidden))&amp;nbsp;{&amp;nbsp;&lt;span style="background:gold;"&gt;#&amp;gt;&lt;/span&gt; &lt;span style="color:gray;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;virtual&amp;nbsp;&lt;/span&gt;&lt;span style="background:gold;"&gt;&amp;lt;#=&lt;/span&gt;&amp;nbsp;column.Type&amp;nbsp;&lt;span style="background:gold;"&gt;#&amp;gt;&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="background:gold;"&gt;&amp;lt;#=&lt;/span&gt;&amp;nbsp;column.Name&amp;nbsp;&lt;span style="background:gold;"&gt;#&amp;gt;&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;nbsp;{&amp;nbsp;get;&amp;nbsp;set;&amp;nbsp;}&lt;/span&gt; &lt;span style="background:gold;"&gt;&amp;lt;#&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;span style="background:gold;"&gt;#&amp;gt;&lt;/span&gt; &lt;span style="color:gray;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt; &lt;span style="color:gray;"&gt;}&lt;/span&gt;&lt;/pre&gt;
&lt;br&gt;
At development time, Visual Studio generates the class in the corresponding namespace
which you can then call (yeah, it generates code for generating code...). 
&lt;br&gt;
&lt;br&gt;
Notice we're passing a parameter, which has to have the full namespaced name (even
"string" has to be "System.String"). 
&lt;br&gt;
&lt;br&gt;
The generated class is partial and the parameters are property getters with a backing
field. MSDN suggests that to pass in your parameters you should manually code a partial
class with conventional properties or a constructor. Actually, there's an easier no-code
way. Use the Session property (which is just a Dictionary&amp;lt;string, object&amp;gt;) which
you can use with an Initialize() method. Like this:&lt;br&gt;
&lt;br&gt;
&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;&lt;span style="color:green;"&gt;//create&amp;nbsp;the&amp;nbsp;class&amp;nbsp;generated&amp;nbsp;by&amp;nbsp;TextTemplatingFilePreprocessor&amp;nbsp;&lt;/span&gt; &lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;generator&amp;nbsp;=&amp;nbsp;&lt;span style="color:blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;ClassWriter&lt;/span&gt;(); &lt;span style="color:green;"&gt;//create&amp;nbsp;a&amp;nbsp;session&amp;nbsp;dictionary,&amp;nbsp;fill&amp;nbsp;it&amp;nbsp;and&amp;nbsp;initialize&lt;/span&gt; generator.Session&amp;nbsp;=&amp;nbsp;&lt;span style="color:blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;string&lt;/span&gt;,&amp;nbsp;&lt;span style="color:blue;"&gt;object&lt;/span&gt;&amp;gt;();
generator.Session.Add(&lt;span style="color:#a31515;"&gt;"table"&lt;/span&gt;,&amp;nbsp;table); generator.Initialize(); &lt;span style="color:green;"&gt;//transform!&lt;/span&gt; &lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;text&amp;nbsp;=&amp;nbsp;generator.TransformText();&lt;/pre&gt;The
key things to watch out for: 
&lt;br&gt;
&lt;ul&gt;
&lt;li&gt;
you must create the Session dictionary (it's not initialized internally)&lt;/li&gt;
&lt;li&gt;
you must call Initialize() after it's populated.&lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;
You can also use System.Runtime.Remoting.Messaging.CallContext but weirdly you must
still initialize the Session dictionary (Initialize checks Session first, then CallContext).&lt;br&gt;
&amp;nbsp;&lt;br&gt;
You may be tempted to reuse the T4 template class like this.&lt;br&gt;
&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;&lt;span style="color:green;"&gt;//don't&amp;nbsp;do&amp;nbsp;this&lt;/span&gt; &lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;generator&amp;nbsp;=&amp;nbsp;&lt;span style="color:blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;ClassWriter&lt;/span&gt;(); &lt;span style="color:blue;"&gt;foreach&lt;/span&gt;&amp;nbsp;(&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;item&amp;nbsp;&lt;span style="color:blue;"&gt;in&lt;/span&gt;&amp;nbsp;list)
{ &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;generator.Session&amp;nbsp;=&amp;nbsp;&lt;span style="color:blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;string&lt;/span&gt;,&amp;nbsp;&lt;span style="color:blue;"&gt;object&lt;/span&gt;&amp;gt;();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;generator.Session.Add(&lt;span style="color:#a31515;"&gt;"table"&lt;/span&gt;,&amp;nbsp;item);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;generator.Initialize(); &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;txt&amp;nbsp;=&amp;nbsp;generator.TransformText();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;WriteText(item,&amp;nbsp;txt); }&lt;/pre&gt;The template class actually
uses an internal StringBuilder called GenerationEnvironment. So each call returns
everything you wrote before. You can't actually reset the StringBuilder (although
you can append to it with Write overloads). So, always create the template class &lt;i&gt;within &lt;/i&gt;the
loop.&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://martinwilley.com/blog/aggbug.ashx?id=156ef515-1762-4604-84b9-d1213b895b03" /&gt;</description>
      <comments>http://martinwilley.com/blog/CommentView,guid,156ef515-1762-4604-84b9-d1213b895b03.aspx</comments>
      <category>.net 4</category>
      <category>VS2010</category>
    </item>
    <item>
      <trackback:ping>http://martinwilley.com/blog/Trackback.aspx?guid=01ffea52-804a-4fd7-b807-4f05bb4c1b22</trackback:ping>
      <pingback:server>http://martinwilley.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://martinwilley.com/blog/PermaLink,guid,01ffea52-804a-4fd7-b807-4f05bb4c1b22.aspx</pingback:target>
      <dc:creator>Martin</dc:creator>
      <georss:point>0 0</georss:point>
      <wfw:comment>http://martinwilley.com/blog/CommentView,guid,01ffea52-804a-4fd7-b807-4f05bb4c1b22.aspx</wfw:comment>
      <wfw:commentRss>http://martinwilley.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=01ffea52-804a-4fd7-b807-4f05bb4c1b22</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">Strong named assemblies cannot reference
assemblies which aren't strong named. 
<br /><br />
Decompile with ildasm and recompile with ilasm using your key.<br /><br />
Default ILDASM and ILASM locations as of .Net 4.0<br /><br />
"C:\Program Files\Microsoft SDKs\Windows\v7.0A\bin\ildasm.exe" ClassLibrary.dll /out:ClassLibrary.il<br />
"C:\Windows\Microsoft.NET\Framework\v4.0.30319\ilasm.exe" ClassLibrary.il /res:ClassLibrary.res
/dll /key:myKey.snk /out:ClassLibrary.dll<br /><p></p><img width="0" height="0" src="http://martinwilley.com/blog/aggbug.ashx?id=01ffea52-804a-4fd7-b807-4f05bb4c1b22" /></body>
      <title>ildasm and ilasm to sign an unsigned assembly</title>
      <guid isPermaLink="false">http://martinwilley.com/blog/PermaLink,guid,01ffea52-804a-4fd7-b807-4f05bb4c1b22.aspx</guid>
      <link>http://martinwilley.com/blog/2011/05/02/ildasmAndIlasmToSignAnUnsignedAssembly.aspx</link>
      <pubDate>Mon, 02 May 2011 12:50:05 GMT</pubDate>
      <description>Strong named assemblies cannot reference assemblies which aren't strong named. &lt;br&gt;
&lt;br&gt;
Decompile with ildasm and recompile with ilasm using your key.&lt;br&gt;
&lt;br&gt;
Default ILDASM and ILASM locations as of .Net 4.0&lt;br&gt;
&lt;br&gt;
"C:\Program Files\Microsoft SDKs\Windows\v7.0A\bin\ildasm.exe" ClassLibrary.dll /out:ClassLibrary.il&lt;br&gt;
"C:\Windows\Microsoft.NET\Framework\v4.0.30319\ilasm.exe" ClassLibrary.il /res:ClassLibrary.res
/dll /key:myKey.snk /out:ClassLibrary.dll&lt;br&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://martinwilley.com/blog/aggbug.ashx?id=01ffea52-804a-4fd7-b807-4f05bb4c1b22" /&gt;</description>
      <comments>http://martinwilley.com/blog/CommentView,guid,01ffea52-804a-4fd7-b807-4f05bb4c1b22.aspx</comments>
      <category>.net 4</category>
    </item>
    <item>
      <trackback:ping>http://martinwilley.com/blog/Trackback.aspx?guid=b8fbbe6a-5e86-4963-a561-52f6b8aeb4e9</trackback:ping>
      <pingback:server>http://martinwilley.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://martinwilley.com/blog/PermaLink,guid,b8fbbe6a-5e86-4963-a561-52f6b8aeb4e9.aspx</pingback:target>
      <dc:creator>Martin</dc:creator>
      <wfw:comment>http://martinwilley.com/blog/CommentView,guid,b8fbbe6a-5e86-4963-a561-52f6b8aeb4e9.aspx</wfw:comment>
      <wfw:commentRss>http://martinwilley.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=b8fbbe6a-5e86-4963-a561-52f6b8aeb4e9</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
My Codeplex project, <a href="http://dbschemareader.codeplex.com/" target="_blank">Database
Schema Reader</a>, has a new version.
</p>
        <p>
I needed to create a SQLite database was a replica of a parent SQL Server database.
The existing project could easily read the schema, and the code generation tools could
give me the table DDL and the insert SQL. It was just a matter of executing the SQL
and creating the database file. 
</p>
        <p>
So I created another simple Windows Forms UI. The SqlWriter class needed some tweaks
for SQLite support (and I added integration tests).
</p>
        <p>
For fun, I decided to see if it could also support Microsoft's latest version of SQL
Server CE 4.0. 
</p>
        <p>
SQL Server CE 4.0 is, like SQLite, an in-process database which can be XCOPY deployed.
And unlike previous versions, it is easily able to run ASP.Net websites (it's the
default database behind WebMatrix). And 4.0 provides the standard ADO GetSchema which
my Database Schema Reader uses (3.5 throws a Not Implemented exception).
</p>
        <p>
It has some of the same limitations as SQLite, such as no stored procedures (good
riddance), and no output parameters. But it also has additional limitations. In SQLite
you can batch together multiple SQL statements in a single line and execute them in
one command. You can't in SQL Server CE.
</p>
        <p>
Unlike SQLite's weakly typed and very simple data types, SQL Server CE 4.0 has most
of the standard data types as SQL Server Express and full versions. Unfortunately,
this was the big problem. If your table is defined with an IDENTITY primary key, you
can't insert the data row with the same primary key, and subsequent foreign key relationships
are broken. It's a pretty critical limitation for my scenario. 
</p>
        <p>
SQL Server CE 4 only supports a subset of SQL Server data types. The one data type
it didn't support, which my database (and later versions of Northwind) use, is NVARCHAR(MAX).
You have to use the horrible old NTEXT data type. I could have written a DDL provider
that translates varchar max to ntext, but I don't think it's worth the effort.
</p>
        <p>
So my SQL Server CE creation program has major limitations, compared to the SQLite
version. It's built into CopyToSQLite.exe, and auto-detects if you've installed SQL
Server CE, but you have to have a very simple database for it to work.
</p>
        <p>
SQL Server CE 4 also doesn't support the ADO Sync framework which allows you to synchronize
a disconnected database to a parent SQL Server database. Even SQL Server 2008 R2 Management
Studio doesn't support it (you have to use Visual Studio 2010 with SP1).
</p>
        <p>
The new FETCH /OFFSET syntax for paging, that will be SQL Server 11, is very nice
though. I'm looking forward to that.
</p>
        <img width="0" height="0" src="http://martinwilley.com/blog/aggbug.ashx?id=b8fbbe6a-5e86-4963-a561-52f6b8aeb4e9" />
      </body>
      <title>Database Schema Reader now with extra SQLite</title>
      <guid isPermaLink="false">http://martinwilley.com/blog/PermaLink,guid,b8fbbe6a-5e86-4963-a561-52f6b8aeb4e9.aspx</guid>
      <link>http://martinwilley.com/blog/2011/04/09/DatabaseSchemaReaderNowWithExtraSQLite.aspx</link>
      <pubDate>Sat, 09 Apr 2011 18:05:41 GMT</pubDate>
      <description>&lt;p&gt;
My Codeplex project, &lt;a href="http://dbschemareader.codeplex.com/" target="_blank"&gt;Database
Schema Reader&lt;/a&gt;, has a new version.
&lt;/p&gt;
&lt;p&gt;
I needed to create a SQLite database was a replica of a parent SQL Server database.
The existing project could easily read the schema, and the code generation tools could
give me the table DDL and the insert SQL. It was just a matter of executing the SQL
and creating the database file. 
&lt;/p&gt;
&lt;p&gt;
So I created another simple Windows Forms UI. The SqlWriter class needed some tweaks
for SQLite support (and I added integration tests).
&lt;/p&gt;
&lt;p&gt;
For fun, I decided to see if it could also support Microsoft's latest version of SQL
Server CE 4.0. 
&lt;/p&gt;
&lt;p&gt;
SQL Server CE 4.0 is, like SQLite, an in-process database which can be XCOPY deployed.
And unlike previous versions, it is easily able to run ASP.Net websites (it's the
default database behind WebMatrix). And 4.0 provides the standard ADO GetSchema which
my Database Schema Reader uses (3.5 throws a Not Implemented exception).
&lt;/p&gt;
&lt;p&gt;
It has some of the same limitations as SQLite, such as no stored procedures (good
riddance), and no output parameters. But it also has additional limitations. In SQLite
you can batch together multiple SQL statements in a single line and execute them in
one command. You can't in SQL Server CE.
&lt;/p&gt;
&lt;p&gt;
Unlike SQLite's weakly typed and very simple data types, SQL Server CE 4.0 has most
of the standard data types as SQL Server Express and full versions. Unfortunately,
this was the big problem. If your table is defined with an IDENTITY primary key, you
can't insert the data row with the same primary key, and subsequent foreign key relationships
are broken. It's a pretty critical limitation for my scenario. 
&lt;/p&gt;
&lt;p&gt;
SQL Server CE 4 only supports a subset of SQL Server data types. The one data type
it didn't support, which my database (and later versions of Northwind) use, is NVARCHAR(MAX).
You have to use the horrible old NTEXT data type. I could have written a DDL provider
that translates varchar max to ntext, but I don't think it's worth the effort.
&lt;/p&gt;
&lt;p&gt;
So my SQL Server CE creation program has major limitations, compared to the SQLite
version. It's built into CopyToSQLite.exe, and auto-detects if you've installed SQL
Server CE, but you have to have a very simple database for it to work.
&lt;/p&gt;
&lt;p&gt;
SQL Server CE 4 also doesn't support the ADO Sync framework which allows you to synchronize
a disconnected database to a parent SQL Server database. Even SQL Server 2008 R2 Management
Studio doesn't support it (you have to use Visual Studio 2010 with SP1).
&lt;/p&gt;
&lt;p&gt;
The new FETCH /OFFSET syntax for paging, that will be SQL Server 11, is very nice
though. I'm looking forward to that.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://martinwilley.com/blog/aggbug.ashx?id=b8fbbe6a-5e86-4963-a561-52f6b8aeb4e9" /&gt;</description>
      <comments>http://martinwilley.com/blog/CommentView,guid,b8fbbe6a-5e86-4963-a561-52f6b8aeb4e9.aspx</comments>
      <category>.net 4</category>
      <category>Codeplex</category>
      <category>Database Schema Reader</category>
    </item>
    <item>
      <trackback:ping>http://martinwilley.com/blog/Trackback.aspx?guid=077263aa-3d47-480f-94f1-50ff5689888d</trackback:ping>
      <pingback:server>http://martinwilley.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://martinwilley.com/blog/PermaLink,guid,077263aa-3d47-480f-94f1-50ff5689888d.aspx</pingback:target>
      <dc:creator>Martin</dc:creator>
      <georss:point>0 0</georss:point>
      <wfw:comment>http://martinwilley.com/blog/CommentView,guid,077263aa-3d47-480f-94f1-50ff5689888d.aspx</wfw:comment>
      <wfw:commentRss>http://martinwilley.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=077263aa-3d47-480f-94f1-50ff5689888d</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">VS 2010 web.config transformations are
great.<br />
Change your development web.config which looks like this: 
<br /><br /><pre style="font-family:Consolas;font-size:13;color:black;background:white;"><span style="color:blue;">&lt;?</span><span style="color:#a31515;">xml</span><span style="color:blue;"> </span><span style="color:red;">version</span><span style="color:blue;">=</span>"<span style="color:blue;">1.0</span>"<span style="color:blue;">?&gt;</span><span style="color:blue;">&lt;</span><span style="color:#a31515;">configuration</span><span style="color:blue;">&gt;</span><span style="color:blue;">  &lt;</span><span style="color:#a31515;">connectionStrings</span><span style="color:blue;">&gt;</span><span style="color:blue;">    &lt;</span><span style="color:#a31515;">add</span><span style="color:blue;"> </span><span style="color:red;">name</span><span style="color:blue;">=</span>"<span style="color:blue;">ApplicationServices</span>" <span style="color:blue;">         </span><span style="color:red;">connectionString</span><span style="color:blue;">=</span>"<span style="color:blue;">data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true</span>" <span style="color:blue;">         </span><span style="color:red;">providerName</span><span style="color:blue;">=</span>"<span style="color:blue;">System.Data.SqlClient</span>"<span style="color:blue;"> /&gt;</span><span style="color:blue;">  &lt;/</span><span style="color:#a31515;">connectionStrings</span><span style="color:blue;">&gt;</span><span style="color:blue;">  &lt;</span><span style="color:#a31515;">system.web</span><span style="color:blue;">&gt;</span><span style="color:blue;">    &lt;</span><span style="color:#a31515;">compilation</span><span style="color:blue;"> </span><span style="color:red;">debug</span><span style="color:blue;">=</span>"<span style="color:blue;">true</span>"<span style="color:blue;"> </span><span style="color:red;">targetFramework</span><span style="color:blue;">=</span>"<span style="color:blue;">4.0</span>"<span style="color:blue;">&gt;</span></pre><br />
by adding a Web.<i>DeployTest</i>.config file which looks like this:<br /><br /><pre style="font-family:Consolas;font-size:13;color:black;background:white;"><span style="color:blue;">&lt;?</span><span style="color:#a31515;">xml</span><span style="color:blue;"> </span><span style="color:red;">version</span><span style="color:blue;">=</span>"<span style="color:blue;">1.0</span>"<span style="color:blue;">?&gt;</span><span style="color:blue;">&lt;</span><span style="color:#a31515;">configuration</span><span style="color:blue;"> </span><span style="color:red;">xmlns:xdt</span><span style="color:blue;">=</span>"<span style="color:blue;">http://schemas.microsoft.com/XML-Document-Transform</span>"<span style="color:blue;">&gt;</span><span style="color:blue;">  &lt;</span><span style="color:#a31515;">connectionStrings</span><span style="color:blue;">&gt;</span><span style="color:blue;">    &lt;</span><span style="color:#a31515;">add</span><span style="color:blue;"> </span><span style="color:red;">name</span><span style="color:blue;">=</span>"<span style="color:blue;">ApplicationServices</span>"<span style="color:blue;"> </span><span style="color:red;">connectionString</span><span style="color:blue;">=</span>"<span style="color:blue;">Data Source=StaticVoidSqlServer;Initial Catalog=Northwind;Integrated Security=SSPI;</span>"<span style="color:blue;"> </span><span style="color:red;">providerName</span><span style="color:blue;">=</span>"<span style="color:blue;">System.Data.SqlClient</span>" <span style="color:blue;">         </span><span style="color:red;">xdt:Transform</span><span style="color:blue;">=</span>"<span style="color:blue;">SetAttributes</span>"<span style="color:blue;"> </span><span style="color:red;">xdt:Locator</span><span style="color:blue;">=</span>"<span style="color:blue;">Match(name)</span>"<span style="color:blue;">/&gt;</span><span style="color:blue;">  &lt;/</span><span style="color:#a31515;">connectionStrings</span><span style="color:blue;">&gt;</span><span style="color:blue;">&lt;/</span><span style="color:#a31515;">configuration</span><span style="color:blue;">&gt;</span></pre><br />
Only by default it's tied up with the build configurations (Debug, Release etc) and
the Web deploy story. 
<br />
But I don't want a web deployment package. I want:<br /><ul><li>
a normal "Release" configuration build</li><li>
a directory containing all the website files that I can XCopy deploy (like old school
Visual Studio 2008 publish)</li><li>
the web.config transformed with my custom "DeployTest" name.<br /></li></ul>
Doing it this way means the web.DeployTest.config is not automatically nested under
the web.config (and I should mark it as BuildAction=None).<br />
But that's my requirements. So I wrote an MSBuild file.<br /><br /><h2>Batch file (build.bat)
</h2>
First here's a standard batch file, "build.bat", to launch it (I want MSBuild 4.0):<br /><pre style="font-family: Consolas; font-size: 13px; color: black; background: none repeat scroll 0% 0% white;">%systemroot%\Microsoft.Net\Framework\v4.0.30319\MSBuild.exe build.proj  /t:Release &amp; pause

<br /></pre><h2>MSBuild script (build.proj)
</h2><pre style="font-family: Consolas; font-size: 13px; color: black; background: none repeat scroll 0% 0% white;"><br /><span style="color:blue;">&lt;?</span><span style="color:#a31515;">xml</span><span style="color:blue;"> </span><span style="color:red;">version</span><span style="color:blue;">=</span>"<span style="color:blue;">1.0</span>"<span style="color:blue;"> </span><span style="color:red;">encoding</span><span style="color:blue;">=</span>"<span style="color:blue;">utf-8</span>"<span style="color:blue;"> ?&gt;</span><span style="color:blue;">&lt;</span><span style="color:#a31515;">Project</span><span style="color:blue;"> </span><span style="color:red;">ToolsVersion</span><span style="color:blue;">=</span>"<span style="color:blue;">4.0</span>"<span style="color:blue;"> </span><span style="color:red;">xmlns</span><span style="color:blue;">=</span>"<span style="color:blue;">http://schemas.microsoft.com/developer/msbuild/2003</span>"<span style="color:blue;"> </span><span style="color:red;">DefaultTargets</span><span style="color:blue;">=</span>"<span style="color:blue;">Release</span>"<span style="color:blue;">&gt;</span><span style="color:blue;">  &lt;</span><span style="color:#a31515;">UsingTask</span><span style="color:blue;"> </span><span style="color:red;">TaskName</span><span style="color:blue;">=</span>"<span style="color:blue;">TransformXml</span>"<span style="color:blue;"> </span><span style="color:red;">AssemblyFile</span><span style="color:blue;">=</span>"<span style="color:blue;">$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll</span>"<span style="color:blue;"> /&gt;</span><span style="color:blue;">  &lt;</span><span style="color:#a31515;">PropertyGroup</span><span style="color:blue;">&gt;</span><span style="color:blue;">    &lt;!--</span><span style="color:green;"> properties that are used in this build file - referenced as $(PropertyName) </span><span style="color:blue;">--&gt;</span><span style="color:blue;">    &lt;</span><span style="color:#a31515;">ProjectName</span><span style="color:blue;">&gt;</span>StaticVoid<span style="color:blue;">&lt;/</span><span style="color:#a31515;">ProjectName</span><span style="color:blue;">&gt;</span><span style="color:blue;">    &lt;</span><span style="color:#a31515;">DeployConfiguration</span><span style="color:blue;">&gt;</span>DeployTest<span style="color:blue;">&lt;/</span><span style="color:#a31515;">DeployConfiguration</span><span style="color:blue;">&gt;</span><span style="color:blue;">    &lt;</span><span style="color:#a31515;">PublishPath</span><span style="color:blue;">&gt;</span>$(MSBuildProjectDirectory)\..\Publish\<span style="color:blue;">&lt;/</span><span style="color:#a31515;">PublishPath</span><span style="color:blue;">&gt;</span><span style="color:blue;">    &lt;</span><span style="color:#a31515;">OutputPath</span><span style="color:blue;">&gt;</span>$(PublishPath)\StaticVoid\<span style="color:blue;">&lt;/</span><span style="color:#a31515;">OutputPath</span><span style="color:blue;">&gt;</span><span style="color:blue;">    &lt;</span><span style="color:#a31515;">PackagePath</span><span style="color:blue;">&gt;</span>$(PublishPath)\StaticVoidPackage\<span style="color:blue;">&lt;/</span><span style="color:#a31515;">PackagePath</span><span style="color:blue;">&gt;</span><span style="color:blue;">    &lt;</span><span style="color:#a31515;">TransformInputFile</span><span style="color:blue;">&gt;</span>..\StaticVoid\Web.config<span style="color:blue;">&lt;/</span><span style="color:#a31515;">TransformInputFile</span><span style="color:blue;">&gt;</span><span style="color:blue;">    &lt;</span><span style="color:#a31515;">TransformFile</span><span style="color:blue;">&gt;</span>..\StaticVoid\Web.$(DeployConfiguration).config<span style="color:blue;">&lt;/</span><span style="color:#a31515;">TransformFile</span><span style="color:blue;">&gt;</span><span style="color:blue;">    &lt;</span><span style="color:#a31515;">TransformOutputFile</span><span style="color:blue;">&gt;</span>$(OutputPath)\Web.config<span style="color:blue;">&lt;/</span><span style="color:#a31515;">TransformOutputFile</span><span style="color:blue;">&gt;</span><span style="color:blue;">    &lt;</span><span style="color:#a31515;">ImageResourcesPath</span><span style="color:blue;">&gt;</span>..\ImageResources<span style="color:blue;">&lt;/</span><span style="color:#a31515;">ImageResourcesPath</span><span style="color:blue;">&gt;</span><span style="color:blue;">  &lt;/</span><span style="color:#a31515;">PropertyGroup</span><span style="color:blue;">&gt;</span><span style="color:blue;">  &lt;</span><span style="color:#a31515;">ItemGroup</span><span style="color:blue;">&gt;</span><span style="color:blue;">    &lt;</span><span style="color:#a31515;">ImageResources</span><span style="color:blue;"> </span><span style="color:red;">Include</span><span style="color:blue;">=</span>"<span style="color:blue;">$(ImageResourcesPath)\*.jpg</span>"<span style="color:blue;"> /&gt;</span><span style="color:blue;">  &lt;/</span><span style="color:#a31515;">ItemGroup</span><span style="color:blue;">&gt;</span><span style="color:blue;">  &lt;!--</span><span style="color:green;"> targets </span><span style="color:blue;">--&gt;</span><span style="color:blue;">  &lt;</span><span style="color:#a31515;">Target</span><span style="color:blue;"> </span><span style="color:red;">Name</span><span style="color:blue;">=</span>"<span style="color:blue;">PublishWebsite</span>"<span style="color:blue;">&gt;</span><span style="color:blue;">    &lt;</span><span style="color:#a31515;">Message</span><span style="color:blue;"> </span><span style="color:red;">Text</span><span style="color:blue;">=</span>"<span style="color:blue;">Publishing Website</span>"<span style="color:blue;"> /&gt;</span><span style="color:blue;">    &lt;</span><span style="color:#a31515;">RemoveDir</span><span style="color:blue;"> </span><span style="color:red;">Directories</span><span style="color:blue;">=</span>"<span style="color:blue;">$(PublishPath)</span>"<span style="color:blue;">/&gt;</span><span style="color:blue;">    &lt;!--</span><span style="color:green;"> do a deploy </span><span style="color:blue;">--&gt;</span><span style="color:blue;">    &lt;</span><span style="color:#a31515;">MSBuild</span><span style="color:blue;"> </span><span style="color:red;">Projects</span><span style="color:blue;">=</span>"<span style="color:blue;">..\StaticVoid\StaticVoid.csproj</span>" <span style="color:blue;"></span><span style="color:red;">Properties</span><span style="color:blue;">=</span>"<span style="color:blue;">Configuration=Release;OutputPath=$(PackagePath);DeployOnBuild=true;DeployTarget=PipelinePreDeployCopyAllFilesToOneFolder;AutoParameterizationWebConfigConnectionStrings=false;_PackageTempDir=$(OutputPath)</span>"<span style="color:blue;">/&gt;</span><span style="color:blue;">  &lt;/</span><span style="color:#a31515;">Target</span><span style="color:blue;">&gt;</span><span style="color:blue;">  &lt;</span><span style="color:#a31515;">Target</span><span style="color:blue;"> </span><span style="color:red;">Name</span><span style="color:blue;">=</span>"<span style="color:blue;">Transform</span>"<span style="color:blue;">&gt;</span><span style="color:blue;">    &lt;!--</span><span style="color:green;"> transform the web.config </span><span style="color:blue;">--&gt;</span><span style="color:blue;">    &lt;</span><span style="color:#a31515;">TransformXml</span><span style="color:blue;"> </span><span style="color:red;">Source</span><span style="color:blue;">=</span>"<span style="color:blue;">$(TransformInputFile)</span>" <span style="color:blue;">                  </span><span style="color:red;">Transform</span><span style="color:blue;">=</span>"<span style="color:blue;">$(TransformFile)</span>" <span style="color:blue;">                  </span><span style="color:red;">Destination</span><span style="color:blue;">=</span>"<span style="color:blue;">$(TransformOutputFile)</span>"<span style="color:blue;"> /&gt;</span><span style="color:blue;">  &lt;/</span><span style="color:#a31515;">Target</span><span style="color:blue;">&gt;</span><span style="color:blue;">  &lt;</span><span style="color:#a31515;">Target</span><span style="color:blue;"> </span><span style="color:red;">Name</span><span style="color:blue;">=</span>"<span style="color:blue;">BuildWebsite</span>"<span style="color:blue;"> </span><span style="color:red;">DependsOnTargets</span><span style="color:blue;">=</span>"<span style="color:blue;">PublishWebsite</span>"<span style="color:blue;">&gt;</span><span style="color:blue;">    &lt;!--</span><span style="color:green;"> we don't need the deployment package, we wanted the published files to
copy manually </span><span style="color:blue;">--&gt;</span><span style="color:blue;">    &lt;</span><span style="color:#a31515;">RemoveDir</span><span style="color:blue;"> </span><span style="color:red;">Directories</span><span style="color:blue;">=</span>"<span style="color:blue;">$(PackagePath)</span>"<span style="color:blue;">/&gt;</span><span style="color:blue;">    &lt;!--</span><span style="color:green;"> copy the unmanaged resources </span><span style="color:blue;">--&gt;</span><span style="color:blue;">    &lt;</span><span style="color:#a31515;">Copy</span><span style="color:blue;"> </span><span style="color:red;">SourceFiles</span><span style="color:blue;">=</span>"<span style="color:blue;">@(ImageResources)</span>"<span style="color:blue;"> </span><span style="color:red;">DestinationFolder</span><span style="color:blue;">=</span>"<span style="color:blue;">$(PublishPath)images</span>"<span style="color:blue;"> </span><span style="color:red;">SkipUnchangedFiles</span><span style="color:blue;">=</span>"<span style="color:blue;">true</span>"<span style="color:blue;"> /&gt;</span><span style="color:blue;">  &lt;/</span><span style="color:#a31515;">Target</span><span style="color:blue;">&gt;</span><span style="color:blue;">  </span><span style="color:blue;">  &lt;</span><span style="color:#a31515;">Target</span><span style="color:blue;"> </span><span style="color:red;">Name</span><span style="color:blue;">=</span>"<span style="color:blue;">Release</span>"<span style="color:blue;"> </span><span style="color:red;">DependsOnTargets</span><span style="color:blue;">=</span>"<span style="color:blue;">BuildWebsite; Transform;</span>"<span style="color:blue;">&gt;</span><span style="color:blue;">  &lt;/</span><span style="color:#a31515;">Target</span><span style="color:blue;">&gt;</span><span style="color:blue;">&lt;/</span><span style="color:#a31515;">Project</span><span style="color:blue;">&gt;</span><br />
 <br /></pre><h3>A little explanation
</h3><pre style="font-family:Consolas;font-size:13;color:black;background:white;">The MSBuild task for the website project (StaticVoid.csproj) has a whole set of extra properties set which make it do a deploy.<br />
(Broken here to be easier to read:)<br /><span style="color:blue;">    &lt;</span><span style="color:#a31515;">MSBuild</span><span style="color:blue;"> </span><span style="color:red;">Projects</span><span style="color:blue;">=</span>"<span style="color:blue;">..\StaticVoid\StaticVoid.csproj</span>" <span style="color:blue;"></span><span style="color:red;">Properties</span><span style="color:blue;">=</span>"<span style="color:blue;">Configuration=Release;<br />
OutputPath=$(PackagePath);<br />
DeployOnBuild=true;<br />
DeployTarget=PipelinePreDeployCopyAllFilesToOneFolder;<br />
AutoParameterizationWebConfigConnectionStrings=false;<br />
_PackageTempDir=$(OutputPath)</span>"<span style="color:blue;">/&gt;</span><br /><br /></pre>The regular deployment package is written to $(PackagePath). I don't care about
that, so I delete it.<br />
The actual directory and files that I wanted are written to $(OutputPath) using the
_PackageTempDir property.<br /><br />
For the transform, note the msbuild xml must have <span style="color:#a31515;">Project</span><span style="color:blue;"> </span><span style="color:red;">ToolsVersion</span><span style="color:blue;">=</span>"<span style="color:blue;">4.0</span>"
and 
<br /><pre style="font-family:Consolas;font-size:13;color:black;background:white;"><span style="color:blue;">&lt;</span><span style="color:#a31515;">UsingTask</span><span style="color:blue;"> </span><span style="color:red;">TaskName</span><span style="color:blue;">=</span>"<span style="color:blue;">TransformXml</span>"<span style="color:blue;"></span><span style="color:red;"><br />
AssemblyFile</span><span style="color:blue;">=</span>"<span style="color:blue;">$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll</span>"<span style="color:blue;"> /&gt;</span><br />
And then the transformation:<br /><span style="color:blue;">    &lt;</span><span style="color:#a31515;">TransformXml</span><span style="color:blue;"> </span><span style="color:red;">Source</span><span style="color:blue;">=</span>"<span style="color:blue;">$(TransformInputFile)</span>" <span style="color:blue;">                  </span><span style="color:red;">Transform</span><span style="color:blue;">=</span>"<span style="color:blue;">$(TransformFile)</span>" <span style="color:blue;">                  </span><span style="color:red;">Destination</span><span style="color:blue;">=</span>"<span style="color:blue;">$(TransformOutputFile)</span>"<span style="color:blue;"> /&gt;</span><br /></pre>with $(TransformFile) defined as<br /><pre style="font-family:Consolas;font-size:13;color:black;background:white;"><span style="color:blue;">&lt;</span><span style="color:#a31515;">TransformFile</span><span style="color:blue;">&gt;</span>..\StaticVoid\Web.$(DeployConfiguration).config<span style="color:blue;">&lt;/</span><span style="color:#a31515;">TransformFile</span><span style="color:blue;">&gt;</span></pre>Simply
changing the DeployConfiguration property lets me have test and production builds
which transform things nicely.<br /><br /><h2>Update: the old _CopyWebApplication still works too
</h2>
In Visual Studio 2008 you could use this task:<br /><pre style="font-family:Consolas;font-size:13;color:black;background:white;"><span style="color:blue;">    &lt;</span><span style="color:#a31515;">MSBuild</span><span style="color:blue;"> </span><span style="color:red;">Projects</span><span style="color:blue;">=</span>"<span style="color:blue;">..\StaticVoid\StaticVoid.csproj</span>" <span style="color:blue;">             </span><span style="color:red;">Targets</span><span style="color:blue;">=</span>"<span style="color:blue;">ResolveReferences;_CopyWebApplication</span>" <span style="color:blue;">             </span><span style="color:red;">Properties</span><span style="color:blue;">=</span>"<span style="color:blue;">Configuration=Release;</span><span style="color:blue;">                         WebProjectOutputDir=$(OutputPath);</span><span style="color:blue;">                         OutDir=$(OutputPath)\bin\</span>"<span style="color:blue;"> /&gt;</span></pre>This
still works in Visual Studio 2010's MSBuild (and you don't have a package directory
to delete).<br />
The transforms can still be done manually.<br /><br /><br /><p></p><img width="0" height="0" src="http://martinwilley.com/blog/aggbug.ashx?id=077263aa-3d47-480f-94f1-50ff5689888d" /></body>
      <title>Publish and Transform in MSBuild script</title>
      <guid isPermaLink="false">http://martinwilley.com/blog/PermaLink,guid,077263aa-3d47-480f-94f1-50ff5689888d.aspx</guid>
      <link>http://martinwilley.com/blog/2011/04/07/PublishAndTransformInMSBuildScript.aspx</link>
      <pubDate>Thu, 07 Apr 2011 10:34:35 GMT</pubDate>
      <description>VS 2010 web.config transformations are great.&lt;br&gt;
Change your development web.config which looks like this: 
&lt;br&gt;
&lt;br&gt;
&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color:#a31515;"&gt;xml&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;version&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;1.0&lt;/span&gt;"&lt;span style="color:blue;"&gt;?&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;configuration&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;connectionStrings&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;add&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;ApplicationServices&lt;/span&gt;" &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;connectionString&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;data&amp;nbsp;source=.\SQLEXPRESS;Integrated&amp;nbsp;Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User&amp;nbsp;Instance=true&lt;/span&gt;" &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;providerName&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;System.Data.SqlClient&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;nbsp;/&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;connectionStrings&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;system.web&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;compilation&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;debug&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;true&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;targetFramework&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;4.0&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;br&gt;
by adding a Web.&lt;i&gt;DeployTest&lt;/i&gt;.config file which looks like this:&lt;br&gt;
&lt;br&gt;
&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color:#a31515;"&gt;xml&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;version&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;1.0&lt;/span&gt;"&lt;span style="color:blue;"&gt;?&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;configuration&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;xmlns:xdt&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;http://schemas.microsoft.com/XML-Document-Transform&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;connectionStrings&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;add&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;ApplicationServices&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;connectionString&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;Data&amp;nbsp;Source=StaticVoidSqlServer;Initial&amp;nbsp;Catalog=Northwind;Integrated&amp;nbsp;Security=SSPI;&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;providerName&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;System.Data.SqlClient&lt;/span&gt;" &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;xdt:Transform&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;SetAttributes&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;xdt:Locator&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;Match(name)&lt;/span&gt;"&lt;span style="color:blue;"&gt;/&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;connectionStrings&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;configuration&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt; &lt;/pre&gt;
&lt;br&gt;
Only by default it's tied up with the build configurations (Debug, Release etc) and
the Web deploy story. 
&lt;br&gt;
But I don't want a web deployment package. I want:&lt;br&gt;
&lt;ul&gt;
&lt;li&gt;
a normal "Release" configuration build&lt;/li&gt;
&lt;li&gt;
a directory containing all the website files that I can XCopy deploy (like old school
Visual Studio 2008 publish)&lt;/li&gt;
&lt;li&gt;
the web.config transformed with my custom "DeployTest" name.&lt;br&gt;
&lt;/li&gt;
&lt;/ul&gt;
Doing it this way means the web.DeployTest.config is not automatically nested under
the web.config (and I should mark it as BuildAction=None).&lt;br&gt;
But that's my requirements. So I wrote an MSBuild file.&lt;br&gt;
&lt;br&gt;
&lt;h2&gt;Batch file (build.bat)
&lt;/h2&gt;
First here's a standard batch file, "build.bat", to launch it (I want MSBuild 4.0):&lt;br&gt;
&lt;pre style="font-family: Consolas; font-size: 13px; color: black; background: none repeat scroll 0% 0% white;"&gt;%systemroot%\Microsoft.Net\Framework\v4.0.30319\MSBuild.exe&amp;nbsp;build.proj&amp;nbsp;&amp;nbsp;/t:Release&amp;nbsp;&amp;amp;&amp;nbsp;pause

&lt;br&gt;
&lt;/pre&gt;
&lt;h2&gt;MSBuild script (build.proj)
&lt;/h2&gt;
&lt;pre style="font-family: Consolas; font-size: 13px; color: black; background: none repeat scroll 0% 0% white;"&gt;
&lt;br&gt;
&lt;span style="color:blue;"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color:#a31515;"&gt;xml&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;version&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;1.0&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;encoding&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;utf-8&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;nbsp;?&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Project&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;ToolsVersion&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;4.0&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;xmlns&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;http://schemas.microsoft.com/developer/msbuild/2003&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;DefaultTargets&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;Release&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;UsingTask&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;TaskName&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;TransformXml&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;AssemblyFile&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;nbsp;/&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;PropertyGroup&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;!--&lt;/span&gt;&lt;span style="color:green;"&gt;&amp;nbsp;properties&amp;nbsp;that&amp;nbsp;are&amp;nbsp;used&amp;nbsp;in&amp;nbsp;this&amp;nbsp;build&amp;nbsp;file&amp;nbsp;-&amp;nbsp;referenced&amp;nbsp;as&amp;nbsp;$(PropertyName)&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;--&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ProjectName&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;StaticVoid&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ProjectName&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;DeployConfiguration&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;DeployTest&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;DeployConfiguration&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;PublishPath&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;$(MSBuildProjectDirectory)\..\Publish\&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;PublishPath&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;OutputPath&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;$(PublishPath)\StaticVoid\&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;OutputPath&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;PackagePath&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;$(PublishPath)\StaticVoidPackage\&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;PackagePath&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;TransformInputFile&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;..\StaticVoid\Web.config&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;TransformInputFile&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;TransformFile&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;..\StaticVoid\Web.$(DeployConfiguration).config&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;TransformFile&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;TransformOutputFile&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;$(OutputPath)\Web.config&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;TransformOutputFile&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ImageResourcesPath&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;..\ImageResources&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ImageResourcesPath&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;PropertyGroup&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ItemGroup&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ImageResources&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;Include&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;$(ImageResourcesPath)\*.jpg&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;nbsp;/&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ItemGroup&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;lt;!--&lt;/span&gt;&lt;span style="color:green;"&gt;&amp;nbsp;targets&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;--&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Target&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;Name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;PublishWebsite&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Message&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;Text&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;Publishing&amp;nbsp;Website&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;nbsp;/&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;RemoveDir&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;Directories&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;$(PublishPath)&lt;/span&gt;"&lt;span style="color:blue;"&gt;/&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;!--&lt;/span&gt;&lt;span style="color:green;"&gt;&amp;nbsp;do&amp;nbsp;a&amp;nbsp;deploy&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;--&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;MSBuild&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;Projects&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;..\StaticVoid\StaticVoid.csproj&lt;/span&gt;" &lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;Properties&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;Configuration=Release;OutputPath=$(PackagePath);DeployOnBuild=true;DeployTarget=PipelinePreDeployCopyAllFilesToOneFolder;AutoParameterizationWebConfigConnectionStrings=false;_PackageTempDir=$(OutputPath)&lt;/span&gt;"&lt;span style="color:blue;"&gt;/&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Target&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Target&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;Name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;Transform&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;!--&lt;/span&gt;&lt;span style="color:green;"&gt;&amp;nbsp;transform&amp;nbsp;the&amp;nbsp;web.config&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;--&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;TransformXml&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;Source&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;$(TransformInputFile)&lt;/span&gt;" &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;Transform&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;$(TransformFile)&lt;/span&gt;" &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;Destination&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;$(TransformOutputFile)&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;nbsp;/&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Target&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Target&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;Name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;BuildWebsite&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;DependsOnTargets&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;PublishWebsite&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;!--&lt;/span&gt;&lt;span style="color:green;"&gt;&amp;nbsp;we&amp;nbsp;don't&amp;nbsp;need&amp;nbsp;the&amp;nbsp;deployment&amp;nbsp;package,&amp;nbsp;we&amp;nbsp;wanted&amp;nbsp;the&amp;nbsp;published&amp;nbsp;files&amp;nbsp;to
copy manually &lt;/span&gt;&lt;span style="color:blue;"&gt;--&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;RemoveDir&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;Directories&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;$(PackagePath)&lt;/span&gt;"&lt;span style="color:blue;"&gt;/&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;!--&lt;/span&gt;&lt;span style="color:green;"&gt;&amp;nbsp;copy&amp;nbsp;the&amp;nbsp;unmanaged&amp;nbsp;resources&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;--&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Copy&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;SourceFiles&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;@(ImageResources)&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;DestinationFolder&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;$(PublishPath)images&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;SkipUnchangedFiles&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;true&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;nbsp;/&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Target&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Target&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;Name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;Release&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;DependsOnTargets&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;BuildWebsite;&amp;nbsp;Transform;&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Target&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Project&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&lt;br&gt;
&lt;/pre&gt;
&lt;h3&gt;A little explanation
&lt;/h3&gt;
&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;The MSBuild task for the website project (StaticVoid.csproj) has a whole set of extra properties set which make it do a deploy.&lt;br&gt;
(Broken here to be easier to read:)&lt;br&gt;
&lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;MSBuild&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;Projects&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;..\StaticVoid\StaticVoid.csproj&lt;/span&gt;" &lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;Properties&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;Configuration=Release;&lt;br&gt;
OutputPath=$(PackagePath);&lt;br&gt;
DeployOnBuild=true;&lt;br&gt;
DeployTarget=PipelinePreDeployCopyAllFilesToOneFolder;&lt;br&gt;
AutoParameterizationWebConfigConnectionStrings=false;&lt;br&gt;
_PackageTempDir=$(OutputPath)&lt;/span&gt;"&lt;span style="color:blue;"&gt;/&amp;gt;&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;
&lt;/pre&gt;The regular deployment package is written to $(PackagePath). I don't care about
that, so I delete it.&lt;br&gt;
The actual directory and files that I wanted are written to $(OutputPath) using the
_PackageTempDir property.&lt;br&gt;
&lt;br&gt;
For the transform, note the msbuild xml must have &lt;span style="color:#a31515;"&gt;Project&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;ToolsVersion&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;4.0&lt;/span&gt;"
and 
&lt;br&gt;
&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;UsingTask&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;TaskName&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;TransformXml&lt;/span&gt;"&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;
&lt;br&gt;
AssemblyFile&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;nbsp;/&amp;gt;&lt;/span&gt; 
&lt;br&gt;
And then the transformation:&lt;br&gt;
&lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;TransformXml&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;Source&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;$(TransformInputFile)&lt;/span&gt;" &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;Transform&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;$(TransformFile)&lt;/span&gt;" &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;Destination&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;$(TransformOutputFile)&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;nbsp;/&amp;gt;&lt;/span&gt;
&lt;br&gt;
&lt;/pre&gt;with $(TransformFile) defined as&lt;br&gt;
&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;TransformFile&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;..\StaticVoid\Web.$(DeployConfiguration).config&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;TransformFile&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt; &lt;/pre&gt;Simply
changing the DeployConfiguration property lets me have test and production builds
which transform things nicely.&lt;br&gt;
&lt;br&gt;
&lt;h2&gt;Update: the old _CopyWebApplication still works too
&lt;/h2&gt;
In Visual Studio 2008 you could use this task:&lt;br&gt;
&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;MSBuild&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;Projects&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;..\StaticVoid\StaticVoid.csproj&lt;/span&gt;" &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;Targets&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;ResolveReferences;_CopyWebApplication&lt;/span&gt;" &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;Properties&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;Configuration=Release;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;WebProjectOutputDir=$(OutputPath);&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;OutDir=$(OutputPath)\bin\&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;nbsp;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;This
still works in Visual Studio 2010's MSBuild (and you don't have a package directory
to delete).&lt;br&gt;
The transforms can still be done manually.&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://martinwilley.com/blog/aggbug.ashx?id=077263aa-3d47-480f-94f1-50ff5689888d" /&gt;</description>
      <comments>http://martinwilley.com/blog/CommentView,guid,077263aa-3d47-480f-94f1-50ff5689888d.aspx</comments>
      <category>.net 4</category>
      <category>VS2010</category>
    </item>
    <item>
      <trackback:ping>http://martinwilley.com/blog/Trackback.aspx?guid=09195658-ab1c-4c53-a1bd-b8a63e3ee3be</trackback:ping>
      <pingback:server>http://martinwilley.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://martinwilley.com/blog/PermaLink,guid,09195658-ab1c-4c53-a1bd-b8a63e3ee3be.aspx</pingback:target>
      <dc:creator>Martin</dc:creator>
      <wfw:comment>http://martinwilley.com/blog/CommentView,guid,09195658-ab1c-4c53-a1bd-b8a63e3ee3be.aspx</wfw:comment>
      <wfw:commentRss>http://martinwilley.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=09195658-ab1c-4c53-a1bd-b8a63e3ee3be</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
A long time ago I wrote my <a href="http://www.martinwilley.com/net/code/dbschema/dbschema.html" target="_blank">database
schema reader</a>. It was 2005, .Net 2.0 was just out and I was learning about the
new features. .Net 2.0's ADO DbProviderFactory had a nice idea, GetSchema, to get
database independent schema information. But the GetSchema collections were slightly
different for each database, and they were data tables. So I wrote a simple facade
over them to get proper classes.
</p>
        <p>
Initially I used it to generate CRUD stored procedures, and then to generate data
access code, even including NHibernate mappings. I even did some (simple) database
conversions. All this was quite icky, and each time I did the code-gen a different
way, but the core facade worked well. 
</p>
        <p>
After getting a couple of queries about <a href="http://www.martinwilley.com/net/code/dbschema/databaseschema.html" target="_blank">the
extracts I'd already posted</a>, I thought I might as well put up the entire source
code. So here's <a href="http://dbschemareader.codeplex.com/" target="_blank">the
codeplex project</a> with the source code, and even some basic SQL code-gen.
</p>
        <p>
I picked Codeplex just because it's more .Net-centric than Google code or github,
plus I'm more familiar with TFS and Subversion source control. It was pretty easy.
I don't expect many downloads (if any!), but maybe a couple of people can steal the
relevant bits of source code.
</p>
        <p>
Check out the <a href="http://dbschemareader.codeplex.com/" target="_blank">database
schema reader codeplex project</a>.
</p>
        <img width="0" height="0" src="http://martinwilley.com/blog/aggbug.ashx?id=09195658-ab1c-4c53-a1bd-b8a63e3ee3be" />
      </body>
      <title>Database Schema Reader</title>
      <guid isPermaLink="false">http://martinwilley.com/blog/PermaLink,guid,09195658-ab1c-4c53-a1bd-b8a63e3ee3be.aspx</guid>
      <link>http://martinwilley.com/blog/2010/11/01/DatabaseSchemaReader.aspx</link>
      <pubDate>Mon, 01 Nov 2010 11:59:33 GMT</pubDate>
      <description>&lt;p&gt;
A long time ago I wrote my &lt;a href="http://www.martinwilley.com/net/code/dbschema/dbschema.html" target="_blank"&gt;database
schema reader&lt;/a&gt;. It was 2005, .Net 2.0 was just out and I was learning about the
new features. .Net 2.0's ADO DbProviderFactory had a nice idea, GetSchema, to get
database independent schema information. But the GetSchema collections were slightly
different for each database, and they were data tables. So I wrote a simple facade
over them to get proper classes.
&lt;/p&gt;
&lt;p&gt;
Initially I used it to generate CRUD stored procedures, and then to generate data
access code, even including NHibernate mappings. I even did some (simple) database
conversions. All this was quite icky, and each time I did the code-gen a different
way, but the core facade worked well. 
&lt;/p&gt;
&lt;p&gt;
After getting a couple of queries about &lt;a href="http://www.martinwilley.com/net/code/dbschema/databaseschema.html" target="_blank"&gt;the
extracts I'd already posted&lt;/a&gt;, I thought I might as well put up the entire source
code. So here's &lt;a href="http://dbschemareader.codeplex.com/" target="_blank"&gt;the
codeplex project&lt;/a&gt; with the source code, and even some basic SQL code-gen.
&lt;/p&gt;
&lt;p&gt;
I picked Codeplex just because it's more .Net-centric than Google code or github,
plus I'm more familiar with TFS and Subversion source control. It was pretty easy.
I don't expect many downloads (if any!), but maybe a couple of people can steal the
relevant bits of source code.
&lt;/p&gt;
&lt;p&gt;
Check out the &lt;a href="http://dbschemareader.codeplex.com/" target="_blank"&gt;database
schema reader codeplex project&lt;/a&gt;.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://martinwilley.com/blog/aggbug.ashx?id=09195658-ab1c-4c53-a1bd-b8a63e3ee3be" /&gt;</description>
      <comments>http://martinwilley.com/blog/CommentView,guid,09195658-ab1c-4c53-a1bd-b8a63e3ee3be.aspx</comments>
      <category>.net 4</category>
      <category>Codeplex</category>
      <category>VS2010</category>
    </item>
    <item>
      <trackback:ping>http://martinwilley.com/blog/Trackback.aspx?guid=3c13f5c7-17e1-42e1-be64-3e4bea605a5a</trackback:ping>
      <pingback:server>http://martinwilley.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://martinwilley.com/blog/PermaLink,guid,3c13f5c7-17e1-42e1-be64-3e4bea605a5a.aspx</pingback:target>
      <dc:creator>Martin</dc:creator>
      <wfw:comment>http://martinwilley.com/blog/CommentView,guid,3c13f5c7-17e1-42e1-be64-3e4bea605a5a.aspx</wfw:comment>
      <wfw:commentRss>http://martinwilley.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=3c13f5c7-17e1-42e1-be64-3e4bea605a5a</wfw:commentRss>
      <slash:comments>3</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
One of the really useful Visual Studio add-ins is <a href="http://weblogs.asp.net/alex_papadimoulis/archive/2004/05/25/Smart-Paster-1.1-Add-In---StringBuilder-and-Better-C_2300_-Handling.aspx" target="_blank">Smart
Paster</a>. It adds a "Paste As." context menu that allows you to paste in the clipboard
text as a comment, a correctly quoted string or a string builder.
</p>
        <p>
          <a href="http://www.martinwilley.com/blog/content/binary/SmartPastein2010_E81F/smartpaster.png">
            <img style="border-width: 0px; display: inline;" title="smartpaster" alt="smartpaster" src="http://www.martinwilley.com/blog/content/binary/SmartPastein2010_E81F/smartpaster_thumb.png" height="46" border="0" width="244" />
          </a>
        </p>
        <p>
There are versions for VS 2003, 2005 and 2008. But not 2010.
</p>
        <p>
Sometimes you can just copy in the dll and addin file into the VS 2010 Addins folder
(.\Documents\Visual Studio 2010\Addins) and edit the addin file (it's just xml) to
say "10.0" instead of "9.0". But that doesn't work for SmartPaster - VS 2010 shows
an error and insists on disabling the addin.
</p>
        <p>
The VS 2008 download includes the source, so I tried to upgrade it.
</p>
        <p>
It turns out the problem is when it creates the context menus it sets the CommandBarButton.FaceId
property (to show an image next to the text). But in VS2010 that throws a DeprecatedException. 
</p>
        <p>
Ok, simple fix, but the original source is old code with a fairly high WTF-per-line
ratio (well, it was written 2004, .Net 1.1). Before long I had ported it from VB.Net
to C# (thanks <a href="http://converter.telerik.com/" target="_blank">Telerik</a>)
and rewritten large parts (mostly refactoring with Coderush). I simplified by dropping
the "regionize" stuff (never use it), the VB support and the configuration form. Here's
my code- you can create a new Extensibility Addin project, replace the Connect class
and add the SmartPaster class- see below.
</p>
        <p>
It's still a port, so certainly not as clean as something just written from scratch.
And perhaps VS2010 has nicer ways of doing all these things now the code window is
a WPF control - the EnvDTE objects are ugly and hard to use. Anyway, thanks to Alex
Papadimoulis for the original code.
</p>
        <p>
          <b>
            <font color="#ff0000">Update: <a href="http://www.martinwilley.com/download/?p=sp2010">download
the binary</a> and unzip into your Addins folder.</font>
          </b> 
</p>
        <p>
          <b>
            <font color="#FF0000">Update 2: source and binary are also on</font>
            <font color="#000080">
              <a href="http://smartpaster2010.codeplex.com/">Codeplex</a>
            </font>
          </b>.<font color="#FF0000"> (It's
exactly the same as shown here.)</font></p>
        <p>
          <font color="#FF0000">
            <b>Update 3 (March 2012): The <a href="http://smartpaster2010.codeplex.com/">Codeplex
version</a> is updated to support VB.Net and is compatible with Visual Studio 11</b>
          </font>
          <br />
        </p>
        <p>
          <br />
        </p>
        <div class="csharpcode">
          <pre class="alt">
            <span class="lnum"> 1: </span>
            <span class="kwrd">using</span> System;</pre>
          <pre>
            <span class="lnum"> 2: </span>
            <span class="kwrd">using</span> System.Collections;</pre>
          <pre class="alt">
            <span class="lnum"> 3: </span>
            <span class="kwrd">using</span> EnvDTE;</pre>
          <pre>
            <span class="lnum"> 4: </span>
            <span class="kwrd">using</span> EnvDTE80;</pre>
          <pre class="alt">
            <span class="lnum"> 5: </span>
            <span class="kwrd">using</span> Extensibility;</pre>
          <pre>
            <span class="lnum"> 6: </span>
            <span class="kwrd">using</span> Microsoft.VisualStudio.CommandBars;</pre>
          <pre class="alt">
            <span class="lnum"> 7: </span> </pre>
          <pre>
            <span class="lnum"> 8: </span>
            <span class="kwrd">namespace</span> SmartPaster2010</pre>
          <pre class="alt">
            <span class="lnum"> 9: </span>{</pre>
          <pre>
            <span class="lnum"> 10: </span>
            <span class="rem">///&lt;summary&gt;The object
for implementing an Add-in.&lt;/summary&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 11: </span>
            <span class="rem">///&lt;seealso
class='IDTExtensibility2' /&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 12: </span>
            <span class="kwrd">public</span>
            <span class="kwrd">class</span> Connect
: IDTExtensibility2</pre>
          <pre class="alt">
            <span class="lnum"> 13: </span> {</pre>
          <pre>
            <span class="lnum"> 14: </span>
            <span class="kwrd">private</span>
            <span class="kwrd">readonly</span> ArrayList
_pasteAsButtons;</pre>
          <pre class="alt">
            <span class="lnum"> 15: </span>
            <span class="kwrd">private</span>
            <span class="kwrd">readonly</span> SmartPaster
_smartPaster;</pre>
          <pre>
            <span class="lnum"> 16: </span>
            <span class="kwrd">private</span> CommandBarPopup
_pasteAsPopup;</pre>
          <pre class="alt">
            <span class="lnum"> 17: </span> </pre>
          <pre>
            <span class="lnum"> 18: </span>
            <span class="rem">///&lt;summary&gt;Implements
the constructor for the Add-in object. Place your initialization code within this
method.&lt;/summary&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 19: </span>
            <span class="kwrd">public</span> Connect()</pre>
          <pre>
            <span class="lnum"> 20: </span> {</pre>
          <pre class="alt">
            <span class="lnum"> 21: </span> _pasteAsButtons = <span class="kwrd">new</span> ArrayList();</pre>
          <pre>
            <span class="lnum"> 22: </span> _smartPaster = <span class="kwrd">new</span> SmartPaster();</pre>
          <pre class="alt">
            <span class="lnum"> 23: </span> }</pre>
          <pre>
            <span class="lnum"> 24: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 25: </span>
            <span class="rem">///&lt;summary&gt;Implements
the OnConnection method of the IDTExtensibility2 interface. Receives notification
that the Add-in is being loaded.&lt;/summary&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 26: </span>
            <span class="rem">///&lt;param term='application'&gt;Root
object of the host application.&lt;/param&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 27: </span>
            <span class="rem">///&lt;param term='connectMode'&gt;Describes
how the Add-in is being loaded.&lt;/param&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 28: </span>
            <span class="rem">///&lt;param term='addInInst'&gt;Object
representing this Add-in.&lt;/param&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 29: </span>
            <span class="rem">///&lt;seealso
class='IDTExtensibility2' /&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 30: </span>
            <span class="kwrd">public</span>
            <span class="kwrd">void</span> OnConnection(<span class="kwrd">object</span> application,
ext_ConnectMode connectMode, </pre>
          <pre>
            <span class="kwrd">object</span> addInInst, <span class="kwrd">ref</span> Array
custom)</pre>
          <pre class="alt">
            <span class="lnum"> 31: </span> {</pre>
          <pre>
            <span class="lnum"> 32: </span> _applicationObject = (DTE2)application;</pre>
          <pre class="alt">
            <span class="lnum"> 33: </span> _addInInstance = (AddIn)addInInst;</pre>
          <pre>
            <span class="lnum"> 34: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 35: </span> </pre>
          <pre>
            <span class="lnum"> 36: </span>
            <span class="rem">//check for the commands</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 37: </span>
            <span class="kwrd">bool</span> cmdExists
= <span class="kwrd">false</span>;</pre>
          <pre>
            <span class="lnum"> 38: </span>
            <span class="kwrd">foreach</span> (Command cmd <span class="kwrd">in</span> _applicationObject.Commands)</pre>
          <pre class="alt">
            <span class="lnum"> 39: </span> {</pre>
          <pre>
            <span class="lnum"> 40: </span>
            <span class="kwrd">if</span> (cmd.Name.EndsWith(<span class="str">"PasteAsComment"</span>,
StringComparison.OrdinalIgnoreCase))</pre>
          <pre class="alt">
            <span class="lnum"> 41: </span> {</pre>
          <pre>
            <span class="lnum"> 42: </span> cmdExists = <span class="kwrd">true</span>;</pre>
          <pre class="alt">
            <span class="lnum"> 43: </span>
            <span class="kwrd">break</span>;</pre>
          <pre>
            <span class="lnum"> 44: </span> }</pre>
          <pre class="alt">
            <span class="lnum"> 45: </span> }</pre>
          <pre>
            <span class="lnum"> 46: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 47: </span>
            <span class="kwrd">try</span>
          </pre>
          <pre>
            <span class="lnum"> 48: </span> {</pre>
          <pre class="alt">
            <span class="lnum"> 49: </span>
            <span class="kwrd">if</span> (!cmdExists)</pre>
          <pre>
            <span class="lnum"> 50: </span> {</pre>
          <pre class="alt">
            <span class="lnum"> 51: </span> AddPasteAsCommands();</pre>
          <pre>
            <span class="lnum"> 52: </span> }</pre>
          <pre class="alt">
            <span class="lnum"> 53: </span> </pre>
          <pre>
            <span class="lnum"> 54: </span>
            <span class="kwrd">if</span> (connectMode ==
ext_ConnectMode.ext_cm_Startup &amp;&amp; _pasteAsPopup == <span class="kwrd">null</span>)</pre>
          <pre class="alt">
            <span class="lnum"> 55: </span> {</pre>
          <pre>
            <span class="lnum"> 56: </span>
            <span class="rem">//Add items to the Context
(Right-Click) Menu</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 57: </span>
            <span class="rem">//find the position
of the &amp;Paste command</span>
          </pre>
          <pre>
            <span class="lnum"> 58: </span>
            <span class="kwrd">int</span> position = 0;</pre>
          <pre class="alt">
            <span class="lnum"> 59: </span> </pre>
          <pre>
            <span class="lnum"> 60: </span> CommandBar codeWindow = _applicationObject.CommandBars[<span class="str">"Code
Window"</span>];</pre>
          <pre class="alt">
            <span class="lnum"> 61: </span> </pre>
          <pre>
            <span class="lnum"> 62: </span>
            <span class="kwrd">for</span> (<span class="kwrd">int</span> i
= 1; i &lt;= codeWindow.Controls.Count; i++)</pre>
          <pre class="alt">
            <span class="lnum"> 63: </span> {</pre>
          <pre>
            <span class="lnum"> 64: </span>
            <span class="kwrd">if</span> (codeWindow.Controls[i].Caption
== <span class="str">"&amp;Paste"</span>)</pre>
          <pre class="alt">
            <span class="lnum"> 65: </span> {</pre>
          <pre>
            <span class="lnum"> 66: </span> position = i;</pre>
          <pre class="alt">
            <span class="lnum"> 67: </span>
            <span class="kwrd">break</span>;</pre>
          <pre>
            <span class="lnum"> 68: </span> }</pre>
          <pre class="alt">
            <span class="lnum"> 69: </span> }</pre>
          <pre>
            <span class="lnum"> 70: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 71: </span>
            <span class="rem">//add the popup
menu "Paste As...", which may already be on the menu</span>
          </pre>
          <pre>
            <span class="lnum"> 72: </span> _pasteAsPopup = (CommandBarPopup)codeWindow.Controls.Add(</pre>
          <pre>(<span class="kwrd">int</span>)MsoControlType.msoControlPopup, 1, Type.Missing,
position + 1, Type.Missing);</pre>
          <pre class="alt">
            <span class="lnum"> 73: </span> _pasteAsPopup.Caption = <span class="str">"Paste
As ..."</span>;</pre>
          <pre>
            <span class="lnum"> 74: </span> AddPasteAsButtons();</pre>
          <pre class="alt">
            <span class="lnum"> 75: </span> }</pre>
          <pre>
            <span class="lnum"> 76: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 77: </span> }</pre>
          <pre>
            <span class="lnum"> 78: </span>
            <span class="kwrd">catch</span> (Exception ex)</pre>
          <pre class="alt">
            <span class="lnum"> 79: </span> {</pre>
          <pre>
            <span class="lnum"> 80: </span> System.Diagnostics.Debug.WriteLine(ex.Message);</pre>
          <pre class="alt">
            <span class="lnum"> 81: </span> }</pre>
          <pre>
            <span class="lnum"> 82: </span> }</pre>
          <pre class="alt">
            <span class="lnum"> 83: </span> </pre>
          <pre>
            <span class="lnum"> 84: </span>
            <span class="kwrd">private</span>
            <span class="kwrd">void</span> AddPasteAsCommands()</pre>
          <pre class="alt">
            <span class="lnum"> 85: </span> {</pre>
          <pre>
            <span class="lnum"> 86: </span>
            <span class="rem">//no configure or regionize
because I never use 'em</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 87: </span> _applicationObject.Commands.AddNamedCommand(_addInInstance, <span class="str">"PasteAsComment"</span>, <span class="str">"Paste
As Comment"</span>, <span class="str">"Pastes clipboard text as a comment."</span>, <span class="kwrd">true</span>,
22, <span class="kwrd">null</span>, Convert.ToInt32(vsCommandStatus.vsCommandStatusSupported)
+ Convert.ToInt32(vsCommandStatus.vsCommandStatusEnabled));</pre>
          <pre>
            <span class="lnum"> 88: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 89: </span> _applicationObject.Commands.AddNamedCommand(_addInInstance, <span class="str">"PasteAsString"</span>, <span class="str">"Paste
As String"</span>, <span class="str">"Pastes clipboard text as a string literal."</span>, <span class="kwrd">true</span>,
22, <span class="kwrd">null</span>, Convert.ToInt32(vsCommandStatus.vsCommandStatusSupported)
+ Convert.ToInt32(vsCommandStatus.vsCommandStatusEnabled));</pre>
          <pre>
            <span class="lnum"> 90: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 91: </span> _applicationObject.Commands.AddNamedCommand(_addInInstance, <span class="str">"PasteAsStringBuilder"</span>, <span class="str">"Paste
As StringBuilder"</span>, <span class="str">"Pastes clipboard text as a stringbuilder."</span>, <span class="kwrd">true</span>,
22, <span class="kwrd">null</span>, Convert.ToInt32(vsCommandStatus.vsCommandStatusSupported)
+ Convert.ToInt32(vsCommandStatus.vsCommandStatusEnabled));</pre>
          <pre>
            <span class="lnum"> 92: </span> }</pre>
          <pre class="alt">
            <span class="lnum"> 93: </span> </pre>
          <pre>
            <span class="lnum"> 94: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 95: </span>
            <span class="kwrd">private</span>
            <span class="kwrd">void</span> AddPasteAsButtons()</pre>
          <pre>
            <span class="lnum"> 96: </span> {</pre>
          <pre class="alt">
            <span class="lnum"> 97: </span> </pre>
          <pre>
            <span class="lnum"> 98: </span>
            <span class="rem">//now the buttons</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 99: </span> CommandBarButton pasteAsButton;</pre>
          <pre>
            <span class="lnum"> 100: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 101: </span>
            <span class="rem">//add "Comment"</span>
          </pre>
          <pre>
            <span class="lnum"> 102: </span> pasteAsButton = AddCommandButton();</pre>
          <pre class="alt">
            <span class="lnum"> 103: </span> pasteAsButton.Caption = <span class="str">"Comment"</span>;</pre>
          <pre>
            <span class="lnum"> 104: </span> pasteAsButton.TooltipText = <span class="str">"Inserts
clipboard with each line prefixed with a comment character"</span>;</pre>
          <pre class="alt">
            <span class="lnum"> 105: </span> pasteAsButton.Click += PasteAsComment;</pre>
          <pre>
            <span class="lnum"> 106: </span> _pasteAsButtons.Add(pasteAsButton);</pre>
          <pre class="alt">
            <span class="lnum"> 107: </span> </pre>
          <pre>
            <span class="lnum"> 108: </span>
            <span class="rem">//add "String"</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 109: </span> pasteAsButton = AddCommandButton();</pre>
          <pre>
            <span class="lnum"> 110: </span> pasteAsButton.Caption = <span class="str">"String"</span>;</pre>
          <pre class="alt">
            <span class="lnum"> 111: </span> pasteAsButton.TooltipText = <span class="str">"Inserts
enquoted clipboard text with line breaks and other characters escaped"</span>;</pre>
          <pre>
            <span class="lnum"> 112: </span> pasteAsButton.Click += PasteAsString;</pre>
          <pre class="alt">
            <span class="lnum"> 113: </span> _pasteAsButtons.Add(pasteAsButton);</pre>
          <pre>
            <span class="lnum"> 114: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 115: </span>
            <span class="rem">//add "StringBuilder"</span>
          </pre>
          <pre>
            <span class="lnum"> 116: </span> pasteAsButton = AddCommandButton();</pre>
          <pre class="alt">
            <span class="lnum"> 117: </span> pasteAsButton.Caption = <span class="str">"StringBuilder"</span>;</pre>
          <pre>
            <span class="lnum"> 118: </span> pasteAsButton.TooltipText = <span class="str">"Inserts
enquoted clipboard text built up by a stringbuilder."</span>;</pre>
          <pre class="alt">
            <span class="lnum"> 119: </span> pasteAsButton.Click += PasteAsStringBuilder;</pre>
          <pre>
            <span class="lnum"> 120: </span> _pasteAsButtons.Add(pasteAsButton);</pre>
          <pre class="alt">
            <span class="lnum"> 121: </span> </pre>
          <pre>
            <span class="lnum"> 122: </span> }</pre>
          <pre class="alt">
            <span class="lnum"> 123: </span> </pre>
          <pre>
            <span class="lnum"> 124: </span>
            <span class="kwrd">private</span> CommandBarButton
AddCommandButton()</pre>
          <pre class="alt">
            <span class="lnum"> 125: </span> {</pre>
          <pre>
            <span class="lnum"> 126: </span> var pasteAsButton = (CommandBarButton)_pasteAsPopup.Controls.Add((<span class="kwrd">int</span>)MsoControlType.msoControlButton);</pre>
          <pre class="alt">
            <span class="lnum"> 127: </span>
            <span class="rem">//in 2010, CommandBarButton.FaceId
throws a DeprecatedException.</span>
          </pre>
          <pre>
            <span class="lnum"> 128: </span>
            <span class="rem">//pasteAsButton.FaceId = 22;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 129: </span> pasteAsButton.Visible = <span class="kwrd">true</span>;</pre>
          <pre>
            <span class="lnum"> 130: </span>
            <span class="kwrd">return</span> pasteAsButton;</pre>
          <pre class="alt">
            <span class="lnum"> 131: </span> }</pre>
          <pre>
            <span class="lnum"> 132: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 133: </span>
            <span class="preproc">#region</span>
            <span class="str">"PasteAs
Handlers"</span>
          </pre>
          <pre>
            <span class="lnum"> 134: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 135: </span>
            <span class="rem">///&lt;summary&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 136: </span>
            <span class="rem">///Occurs when the user clicks
the PasteAsString button.</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 137: </span>
            <span class="rem">///&lt;/summary&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 138: </span>
            <span class="rem">///&lt;param name="ctrl"&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 139: </span>
            <span class="rem">///Denotes the
CommandBarButton control that initiated the event. </span>
          </pre>
          <pre>
            <span class="lnum"> 140: </span>
            <span class="rem">///&lt;/param&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 141: </span>
            <span class="rem">///&lt;param name="cancelDefault"&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 142: </span>
            <span class="rem">///False if the default behavior
associated with the CommandBarButton control occurs, unless its canceled by another
process or add-in. </span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 143: </span>
            <span class="rem">///&lt;/param&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 144: </span>
            <span class="kwrd">private</span>
            <span class="kwrd">void</span> PasteAsString(CommandBarButton
ctrl, <span class="kwrd">ref</span><span class="kwrd">bool</span> cancelDefault)</pre>
          <pre class="alt">
            <span class="lnum"> 145: </span> {</pre>
          <pre>
            <span class="lnum"> 146: </span> _smartPaster.PasteAsString(_applicationObject);</pre>
          <pre class="alt">
            <span class="lnum"> 147: </span> }</pre>
          <pre>
            <span class="lnum"> 148: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 149: </span> </pre>
          <pre>
            <span class="lnum"> 150: </span>
            <span class="rem">///&lt;summary&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 151: </span>
            <span class="rem">///Occurs when
the user clicks the PasteAsComment button.</span>
          </pre>
          <pre>
            <span class="lnum"> 152: </span>
            <span class="rem">///&lt;/summary&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 153: </span>
            <span class="rem">///&lt;param name="ctrl"&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 154: </span>
            <span class="rem">///Denotes the CommandBarButton
control that initiated the event. </span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 155: </span>
            <span class="rem">///&lt;/param&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 156: </span>
            <span class="rem">///&lt;param name="cancelDefault"&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 157: </span>
            <span class="rem">///False if the
default behavior associated with the CommandBarButton control occurs, unless its canceled
by another process or add-in. </span>
          </pre>
          <pre>
            <span class="lnum"> 158: </span>
            <span class="rem">///&lt;/param&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 159: </span>
            <span class="kwrd">private</span>
            <span class="kwrd">void</span> PasteAsComment(CommandBarButton
ctrl, <span class="kwrd">ref</span><span class="kwrd">bool</span> cancelDefault)</pre>
          <pre>
            <span class="lnum"> 160: </span> {</pre>
          <pre class="alt">
            <span class="lnum"> 161: </span> _smartPaster.PasteAsComment(_applicationObject);</pre>
          <pre>
            <span class="lnum"> 162: </span> }</pre>
          <pre class="alt">
            <span class="lnum"> 163: </span> </pre>
          <pre>
            <span class="lnum"> 164: </span>
            <span class="rem">///&lt;summary&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 165: </span>
            <span class="rem">///Occurs when
the user clicks the PasteAsStringBuilder button.</span>
          </pre>
          <pre>
            <span class="lnum"> 166: </span>
            <span class="rem">///&lt;/summary&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 167: </span>
            <span class="rem">///&lt;param name="ctrl"&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 168: </span>
            <span class="rem">///Denotes the CommandBarButton
control that initiated the event. </span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 169: </span>
            <span class="rem">///&lt;/param&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 170: </span>
            <span class="rem">///&lt;param name="cancelDefault"&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 171: </span>
            <span class="rem">///False if the
default behavior associated with the CommandBarButton control occurs, unless its canceled
by another process or add-in. </span>
          </pre>
          <pre>
            <span class="lnum"> 172: </span>
            <span class="rem">///&lt;/param&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 173: </span>
            <span class="kwrd">private</span>
            <span class="kwrd">void</span> PasteAsStringBuilder(CommandBarButton
ctrl, <span class="kwrd">ref</span><span class="kwrd">bool</span> cancelDefault)</pre>
          <pre>
            <span class="lnum"> 174: </span> {</pre>
          <pre class="alt">
            <span class="lnum"> 175: </span> _smartPaster.PasteAsStringBuilder(_applicationObject);</pre>
          <pre>
            <span class="lnum"> 176: </span> }</pre>
          <pre class="alt">
            <span class="lnum"> 177: </span>
            <span class="preproc">#endregion</span>
          </pre>
          <pre>
            <span class="lnum"> 178: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 179: </span>
            <span class="preproc">#region</span>
            <span class="str">"Exec"</span>
          </pre>
          <pre>
            <span class="lnum"> 180: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 181: </span>
            <span class="rem">///&lt;summary&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 182: </span>
            <span class="rem">/// Implements the Exec method
of the IDTCommandTarget interface.</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 183: </span>
            <span class="rem">/// This is called
when the command is invoked.</span>
          </pre>
          <pre>
            <span class="lnum"> 184: </span>
            <span class="rem">///&lt;/summary&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 185: </span>
            <span class="rem">///&lt;param name='commandName'&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 186: </span>
            <span class="rem">/// The name of the command
to execute.</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 187: </span>
            <span class="rem">///&lt;/param&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 188: </span>
            <span class="rem">///&lt;param name='executeOption'&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 189: </span>
            <span class="rem">/// Describes
how the command should be run.</span>
          </pre>
          <pre>
            <span class="lnum"> 190: </span>
            <span class="rem">///&lt;/param&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 191: </span>
            <span class="rem">///&lt;param name='varIn'&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 192: </span>
            <span class="rem">/// Parameters passed from
the caller to the command handler.</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 193: </span>
            <span class="rem">///&lt;/param&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 194: </span>
            <span class="rem">///&lt;param name='varOut'&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 195: </span>
            <span class="rem">/// Parameters
passed from the command handler to the caller.</span>
          </pre>
          <pre>
            <span class="lnum"> 196: </span>
            <span class="rem">///&lt;/param&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 197: </span>
            <span class="rem">///&lt;param name='handled'&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 198: </span>
            <span class="rem">/// Informs the caller if
the command was handled or not.</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 199: </span>
            <span class="rem">///&lt;/param&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 200: </span>
            <span class="rem">///&lt;seealso class='Exec'
/&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 201: </span>
            <span class="kwrd">public</span>
            <span class="kwrd">void</span> Exec(<span class="kwrd">string</span> commandName,
vsCommandExecOption executeOption, <span class="kwrd">ref</span><span class="kwrd">object</span> varIn, <span class="kwrd">ref</span><span class="kwrd">object</span> varOut, <span class="kwrd">ref</span><span class="kwrd">bool</span> handled)</pre>
          <pre>
            <span class="lnum"> 202: </span> {</pre>
          <pre class="alt">
            <span class="lnum"> 203: </span> handled = <span class="kwrd">false</span>;</pre>
          <pre>
            <span class="lnum"> 204: </span>
            <span class="kwrd">if</span> ((executeOption
== vsCommandExecOption.vsCommandExecOptionDoDefault))</pre>
          <pre class="alt">
            <span class="lnum"> 205: </span> {</pre>
          <pre>
            <span class="lnum"> 206: </span> handled = <span class="kwrd">true</span>;</pre>
          <pre class="alt">
            <span class="lnum"> 207: </span>
            <span class="kwrd">switch</span> (commandName)</pre>
          <pre>
            <span class="lnum"> 208: </span> {</pre>
          <pre class="alt">
            <span class="lnum"> 209: </span>
            <span class="rem">//case "SmartPaster.Connect.Configure":</span>
          </pre>
          <pre>
            <span class="lnum"> 210: </span>
            <span class="rem">// //show the config form</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 211: </span>
            <span class="rem">// SmartPasterForm
myForm = new SmartPasterForm();</span>
          </pre>
          <pre>
            <span class="lnum"> 212: </span>
            <span class="rem">// myForm.ShowDialog();</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 213: </span>
            <span class="rem">// //since config
may have changed, show/hide buttons</span>
          </pre>
          <pre>
            <span class="lnum"> 214: </span>
            <span class="rem">// EnableContextMenuButtons();</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 215: </span> </pre>
          <pre>
            <span class="lnum"> 216: </span>
            <span class="rem">// break;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 217: </span>
            <span class="kwrd">case</span>
            <span class="str">"SmartPaster.Connect.PasteAsComment"</span>:</pre>
          <pre>
            <span class="lnum"> 218: </span> _smartPaster.PasteAsComment(_applicationObject);</pre>
          <pre class="alt">
            <span class="lnum"> 219: </span>
            <span class="kwrd">break</span>;</pre>
          <pre>
            <span class="lnum"> 220: </span>
            <span class="kwrd">case</span>
            <span class="str">"SmartPaster.Connect.PasteAsString"</span>:</pre>
          <pre class="alt">
            <span class="lnum"> 221: </span> _smartPaster.PasteAsString(_applicationObject);</pre>
          <pre>
            <span class="lnum"> 222: </span>
            <span class="kwrd">break</span>;</pre>
          <pre class="alt">
            <span class="lnum"> 223: </span>
            <span class="kwrd">case</span>
            <span class="str">"SmartPaster.Connect.PasteAsStringBuilder"</span>:</pre>
          <pre>
            <span class="lnum"> 224: </span> _smartPaster.PasteAsStringBuilder(_applicationObject);</pre>
          <pre class="alt">
            <span class="lnum"> 225: </span>
            <span class="kwrd">break</span>;</pre>
          <pre>
            <span class="lnum"> 226: </span>
            <span class="rem">//case "SmartPaster.Connect.PasteAsRegion":</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 227: </span>
            <span class="rem">// _smartPaster.PasteAsRegion(_applicationObject);</span>
          </pre>
          <pre>
            <span class="lnum"> 228: </span>
            <span class="rem">// break;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 229: </span>
            <span class="kwrd">default</span>:</pre>
          <pre>
            <span class="lnum"> 230: </span> handled = <span class="kwrd">false</span>;</pre>
          <pre class="alt">
            <span class="lnum"> 231: </span>
            <span class="kwrd">break</span>;</pre>
          <pre>
            <span class="lnum"> 232: </span> }</pre>
          <pre class="alt">
            <span class="lnum"> 233: </span> }</pre>
          <pre>
            <span class="lnum"> 234: </span> }</pre>
          <pre class="alt">
            <span class="lnum"> 235: </span>
            <span class="preproc">#endregion</span>
          </pre>
          <pre>
            <span class="lnum"> 236: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 237: </span>
            <span class="preproc">#region</span> Standard
Template Stuff</pre>
          <pre>
            <span class="lnum"> 238: </span>
            <span class="rem">///&lt;summary&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 239: </span>
            <span class="rem">///Implements
the OnDisconnection method of the IDTExtensibility2 interface. Receives notification
that the Add-in is being unloaded.</span>
          </pre>
          <pre>
            <span class="lnum"> 240: </span>
            <span class="rem">///&lt;/summary&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 241: </span>
            <span class="rem">///&lt;param name="disconnectMode"&gt;The
disconnect mode.&lt;/param&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 242: </span>
            <span class="rem">///&lt;param name="custom"&gt;The
custom.&lt;/param&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 243: </span>
            <span class="rem">///&lt;seealso
class="IDTExtensibility2"/&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 244: </span>
            <span class="kwrd">public</span>
            <span class="kwrd">void</span> OnDisconnection(ext_DisconnectMode
disconnectMode, <span class="kwrd">ref</span> Array custom)</pre>
          <pre class="alt">
            <span class="lnum"> 245: </span> {</pre>
          <pre>
            <span class="lnum"> 246: </span>
            <span class="kwrd">if</span> (_pasteAsPopup
!= <span class="kwrd">null</span> &amp;&amp; </pre>
          <pre class="alt">
            <span class="lnum"> 247: </span> (disconnectMode == ext_DisconnectMode.ext_dm_UserClosed
|| disconnectMode == ext_DisconnectMode.ext_dm_HostShutdown))</pre>
          <pre>
            <span class="lnum"> 248: </span> {</pre>
          <pre class="alt">
            <span class="lnum"> 249: </span> _pasteAsPopup.Delete(<span class="kwrd">true</span>);</pre>
          <pre>
            <span class="lnum"> 250: </span> }</pre>
          <pre class="alt">
            <span class="lnum"> 251: </span> }</pre>
          <pre>
            <span class="lnum"> 252: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 253: </span>
            <span class="rem">///&lt;summary&gt;Implements
the OnAddInsUpdate method of the IDTExtensibility2 interface. Receives notification
when the collection of Add-ins has changed.&lt;/summary&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 254: </span>
            <span class="rem">///&lt;param term='custom'&gt;Array
of parameters that are host application specific.&lt;/param&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 255: </span>
            <span class="rem">///&lt;seealso
class='IDTExtensibility2' /&gt; </span>
          </pre>
          <pre>
            <span class="lnum"> 256: </span>
            <span class="kwrd">public</span>
            <span class="kwrd">void</span> OnAddInsUpdate(<span class="kwrd">ref</span> Array
custom)</pre>
          <pre class="alt">
            <span class="lnum"> 257: </span> {</pre>
          <pre>
            <span class="lnum"> 258: </span> }</pre>
          <pre class="alt">
            <span class="lnum"> 259: </span> </pre>
          <pre>
            <span class="lnum"> 260: </span>
            <span class="rem">///&lt;summary&gt;Implements
the OnStartupComplete method of the IDTExtensibility2 interface. Receives notification
that the host application has completed loading.&lt;/summary&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 261: </span>
            <span class="rem">///&lt;param term='custom'&gt;Array
of parameters that are host application specific.&lt;/param&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 262: </span>
            <span class="rem">///&lt;seealso class='IDTExtensibility2'
/&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 263: </span>
            <span class="kwrd">public</span>
            <span class="kwrd">void</span> OnStartupComplete(<span class="kwrd">ref</span> Array
custom)</pre>
          <pre>
            <span class="lnum"> 264: </span> {</pre>
          <pre class="alt">
            <span class="lnum"> 265: </span> }</pre>
          <pre>
            <span class="lnum"> 266: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 267: </span>
            <span class="rem">///&lt;summary&gt;Implements
the OnBeginShutdown method of the IDTExtensibility2 interface. Receives notification
that the host application is being unloaded.&lt;/summary&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 268: </span>
            <span class="rem">///&lt;param term='custom'&gt;Array
of parameters that are host application specific.&lt;/param&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 269: </span>
            <span class="rem">///&lt;seealso
class='IDTExtensibility2' /&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 270: </span>
            <span class="kwrd">public</span>
            <span class="kwrd">void</span> OnBeginShutdown(<span class="kwrd">ref</span> Array
custom)</pre>
          <pre class="alt">
            <span class="lnum"> 271: </span> {</pre>
          <pre>
            <span class="lnum"> 272: </span> }</pre>
          <pre class="alt">
            <span class="lnum"> 273: </span> </pre>
          <pre>
            <span class="lnum"> 274: </span>
            <span class="kwrd">private</span> DTE2 _applicationObject;</pre>
          <pre class="alt">
            <span class="lnum"> 275: </span>
            <span class="kwrd">private</span> AddIn
_addInInstance;</pre>
          <pre>
            <span class="lnum"> 276: </span>
            <span class="preproc">#endregion</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 277: </span> </pre>
          <pre>
            <span class="lnum"> 278: </span>
            <span class="rem">///&lt;summary&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 279: </span>
            <span class="rem">///Queries the
status.</span>
          </pre>
          <pre>
            <span class="lnum"> 280: </span>
            <span class="rem">///&lt;/summary&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 281: </span>
            <span class="rem">///&lt;param name="commandName"&gt;Name
of the command.&lt;/param&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 282: </span>
            <span class="rem">///&lt;param name="neededText"&gt;The
needed text.&lt;/param&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 283: </span>
            <span class="rem">///&lt;param name="statusOption"&gt;The
status option.&lt;/param&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 284: </span>
            <span class="rem">///&lt;param name="commandText"&gt;The
command text.&lt;/param&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 285: </span>
            <span class="kwrd">public</span>
            <span class="kwrd">void</span> QueryStatus(<span class="kwrd">string</span> commandName,
vsCommandStatusTextWanted neededText, <span class="kwrd">ref</span> vsCommandStatus
statusOption, <span class="kwrd">ref</span><span class="kwrd">object</span> commandText)</pre>
          <pre>
            <span class="lnum"> 286: </span> {</pre>
          <pre class="alt">
            <span class="lnum"> 287: </span>
            <span class="kwrd">if</span> (neededText
== vsCommandStatusTextWanted.vsCommandStatusTextWantedNone)</pre>
          <pre>
            <span class="lnum"> 288: </span> {</pre>
          <pre class="alt">
            <span class="lnum"> 289: </span>
            <span class="kwrd">if</span> (commandName.StartsWith(<span class="str">"SmartPaster.Connect"</span>))</pre>
          <pre>
            <span class="lnum"> 290: </span> {</pre>
          <pre class="alt">
            <span class="lnum"> 291: </span>
            <span class="kwrd">if</span> (((_applicationObject.ActiveDocument
!= <span class="kwrd">null</span>)) &amp;&amp; ((_applicationObject.ActiveDocument.Object(<span class="str">"TextDocument"</span>)
!= <span class="kwrd">null</span>)))</pre>
          <pre>
            <span class="lnum"> 292: </span> {</pre>
          <pre class="alt">
            <span class="lnum"> 293: </span> statusOption = vsCommandStatus.vsCommandStatusEnabled
| vsCommandStatus.vsCommandStatusSupported;</pre>
          <pre>
            <span class="lnum"> 294: </span> }</pre>
          <pre class="alt">
            <span class="lnum"> 295: </span>
            <span class="kwrd">else</span>
          </pre>
          <pre>
            <span class="lnum"> 296: </span> {</pre>
          <pre class="alt">
            <span class="lnum"> 297: </span> statusOption = vsCommandStatus.vsCommandStatusSupported;</pre>
          <pre>
            <span class="lnum"> 298: </span> }</pre>
          <pre class="alt">
            <span class="lnum"> 299: </span> }</pre>
          <pre>
            <span class="lnum"> 300: </span>
            <span class="kwrd">else</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 301: </span> {</pre>
          <pre>
            <span class="lnum"> 302: </span> statusOption = vsCommandStatus.vsCommandStatusUnsupported;</pre>
          <pre class="alt">
            <span class="lnum"> 303: </span> }</pre>
          <pre>
            <span class="lnum"> 304: </span> }</pre>
          <pre class="alt">
            <span class="lnum"> 305: </span> }</pre>
          <pre>
            <span class="lnum"> 306: </span> }</pre>
          <pre class="alt">
            <span class="lnum"> 307: </span>}</pre>
        </div>
        <style type="text/css">

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
        <p>
Here's the SmartPaster class.
</p>
        <div class="csharpcode">
          <pre class="alt">
            <span class="lnum"> 1: </span>
            <span class="kwrd">using</span> System;</pre>
          <pre>
            <span class="lnum"> 2: </span>
            <span class="kwrd">using</span> System.IO;</pre>
          <pre class="alt">
            <span class="lnum"> 3: </span>
            <span class="kwrd">using</span> System.Text;</pre>
          <pre>
            <span class="lnum"> 4: </span>
            <span class="kwrd">using</span> System.Windows.Forms; <span class="rem">//clipboard</span></pre>
          <pre class="alt">
            <span class="lnum"> 5: </span>
            <span class="kwrd">using</span> EnvDTE;</pre>
          <pre>
            <span class="lnum"> 6: </span>
            <span class="kwrd">using</span> EnvDTE80;</pre>
          <pre class="alt">
            <span class="lnum"> 7: </span> </pre>
          <pre>
            <span class="lnum"> 8: </span>
            <span class="kwrd">namespace</span> SmartPaster2010</pre>
          <pre class="alt">
            <span class="lnum"> 9: </span>{</pre>
          <pre>
            <span class="lnum"> 10: </span>
            <span class="rem">/// &lt;summary&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 11: </span>
            <span class="rem">/// Class responsible
for doing the pasting/manipulating of clipdata.</span>
          </pre>
          <pre>
            <span class="lnum"> 12: </span>
            <span class="rem">/// &lt;/summary&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 13: </span>
            <span class="kwrd">internal</span>
            <span class="kwrd">sealed</span>
            <span class="kwrd">class</span> SmartPaster</pre>
          <pre>
            <span class="lnum"> 14: </span> {</pre>
          <pre class="alt">
            <span class="lnum"> 15: </span>
            <span class="rem">/// &lt;summary&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 16: </span>
            <span class="rem">/// Convient property to retrieve
the clipboard text from the clipboard</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 17: </span>
            <span class="rem">/// &lt;/summary&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 18: </span>
            <span class="kwrd">private</span>
            <span class="kwrd">static</span>
            <span class="kwrd">string</span> ClipboardText</pre>
          <pre class="alt">
            <span class="lnum"> 19: </span> {</pre>
          <pre>
            <span class="lnum"> 20: </span> get</pre>
          <pre class="alt">
            <span class="lnum"> 21: </span> {</pre>
          <pre>
            <span class="lnum"> 22: </span> IDataObject iData = Clipboard.GetDataObject();</pre>
          <pre class="alt">
            <span class="lnum"> 23: </span>
            <span class="kwrd">if</span> (iData.GetDataPresent(DataFormats.Text))</pre>
          <pre>
            <span class="lnum"> 24: </span>
            <span class="kwrd">return</span> Convert.ToString(iData.GetData(DataFormats.Text));</pre>
          <pre class="alt">
            <span class="lnum"> 25: </span>
            <span class="kwrd">return</span>
            <span class="kwrd">string</span>.Empty;</pre>
          <pre>
            <span class="lnum"> 26: </span> }</pre>
          <pre class="alt">
            <span class="lnum"> 27: </span> }</pre>
          <pre>
            <span class="lnum"> 28: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 29: </span>
            <span class="preproc">#region</span>
            <span class="str">"Stringinize"</span>
          </pre>
          <pre>
            <span class="lnum"> 30: </span>
            <span class="rem">/// &lt;summary&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 31: </span>
            <span class="rem">/// Stringinizes
text passed to it for use in C#</span>
          </pre>
          <pre>
            <span class="lnum"> 32: </span>
            <span class="rem">/// &lt;/summary&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 33: </span>
            <span class="rem">/// &lt;param name="txt"&gt;Text
to be Stringinized&lt;/param&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 34: </span>
            <span class="rem">/// &lt;returns&gt;C# Stringinized
text&lt;/returns&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 35: </span>
            <span class="kwrd">private</span>
            <span class="kwrd">static</span>
            <span class="kwrd">string</span> StringinizeInCs(<span class="kwrd">string</span> txt)</pre>
          <pre>
            <span class="lnum"> 36: </span> {</pre>
          <pre class="alt">
            <span class="lnum"> 37: </span>
            <span class="rem">//c# quote character
-- really just a "</span>
          </pre>
          <pre>
            <span class="lnum"> 38: </span>
            <span class="kwrd">const</span>
            <span class="kwrd">string</span> qChr
= <span class="str">"\""</span>;</pre>
          <pre class="alt">
            <span class="lnum"> 39: </span> </pre>
          <pre>
            <span class="lnum"> 40: </span>
            <span class="rem">//sb to work with</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 41: </span> var sb = <span class="kwrd">new</span> StringBuilder(txt);</pre>
          <pre>
            <span class="lnum"> 42: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 43: </span>
            <span class="rem">//escape appropriately</span>
          </pre>
          <pre>
            <span class="lnum"> 44: </span>
            <span class="rem">//escape the quotes with ""</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 45: </span> sb.Replace(qChr, qChr + qChr);</pre>
          <pre>
            <span class="lnum"> 46: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 47: </span>
            <span class="rem">//insert " at beginning
and end</span>
          </pre>
          <pre>
            <span class="lnum"> 48: </span> sb.Insert(0, <span class="str">"@"</span> + qChr);</pre>
          <pre class="alt">
            <span class="lnum"> 49: </span> sb.Append(qChr);</pre>
          <pre>
            <span class="lnum"> 50: </span>
            <span class="kwrd">return</span> sb.ToString();</pre>
          <pre class="alt">
            <span class="lnum"> 51: </span> }</pre>
          <pre>
            <span class="lnum"> 52: </span>
            <span class="preproc">#endregion</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 53: </span> </pre>
          <pre>
            <span class="lnum"> 54: </span>
            <span class="preproc">#region</span>
            <span class="str">"Commentize"</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 55: </span>
            <span class="rem">/// &lt;summary&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 56: </span>
            <span class="rem">/// Commentizes text passed
to it for use in C#</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 57: </span>
            <span class="rem">/// &lt;/summary&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 58: </span>
            <span class="rem">/// &lt;param name="txt"&gt;Text
to be Stringinized&lt;/param&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 59: </span>
            <span class="rem">/// &lt;returns&gt;C#
Commentized text&lt;/returns&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 60: </span>
            <span class="kwrd">private</span>
            <span class="kwrd">static</span>
            <span class="kwrd">string</span> CommentizeInCs(<span class="kwrd">string</span> txt)</pre>
          <pre class="alt">
            <span class="lnum"> 61: </span> {</pre>
          <pre>
            <span class="lnum"> 62: </span>
            <span class="kwrd">const</span>
            <span class="kwrd">string</span> cmtChar
= <span class="str">"//"</span>;</pre>
          <pre class="alt">
            <span class="lnum"> 63: </span> </pre>
          <pre>
            <span class="lnum"> 64: </span> var sb = <span class="kwrd">new</span> StringBuilder(txt.Length);</pre>
          <pre class="alt">
            <span class="lnum"> 65: </span> </pre>
          <pre>
            <span class="lnum"> 66: </span>
            <span class="rem">//process the passed string
(txt), one line at a time</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 67: </span>
            <span class="rem">//the original
was horrible WTF code</span>
          </pre>
          <pre>
            <span class="lnum"> 68: </span>
            <span class="kwrd">using</span> (var reader = <span class="kwrd">new</span> StringReader(txt))</pre>
          <pre class="alt">
            <span class="lnum"> 69: </span> {</pre>
          <pre>
            <span class="lnum"> 70: </span>
            <span class="kwrd">string</span> line;</pre>
          <pre class="alt">
            <span class="lnum"> 71: </span>
            <span class="kwrd">while</span> ((line
= reader.ReadLine()) != <span class="kwrd">null</span>)</pre>
          <pre>
            <span class="lnum"> 72: </span> {</pre>
          <pre class="alt">
            <span class="lnum"> 73: </span> sb.AppendLine(cmtChar + line);</pre>
          <pre>
            <span class="lnum"> 74: </span> }</pre>
          <pre class="alt">
            <span class="lnum"> 75: </span> }</pre>
          <pre>
            <span class="lnum"> 76: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 77: </span>
            <span class="kwrd">return</span> sb.ToString();</pre>
          <pre>
            <span class="lnum"> 78: </span> }</pre>
          <pre class="alt">
            <span class="lnum"> 79: </span>
            <span class="preproc">#endregion</span>
          </pre>
          <pre>
            <span class="lnum"> 80: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 81: </span>
            <span class="preproc">#region</span>
            <span class="str">"Stringbuilderize"</span>
          </pre>
          <pre>
            <span class="lnum"> 82: </span>
            <span class="kwrd">private</span>
            <span class="kwrd">static</span>
            <span class="kwrd">string</span> StringbuilderizeInCs(<span class="kwrd">string</span> txt, <span class="kwrd">string</span> sbName)</pre>
          <pre class="alt">
            <span class="lnum"> 83: </span> {</pre>
          <pre>
            <span class="lnum"> 84: </span>
            <span class="rem">//c# quote character -- really
just a "</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 85: </span>
            <span class="kwrd">const</span>
            <span class="kwrd">string</span> qChr
= <span class="str">"\""</span>;</pre>
          <pre>
            <span class="lnum"> 86: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 87: </span>
            <span class="rem">//sb to work with</span>
          </pre>
          <pre>
            <span class="lnum"> 88: </span> var sb = <span class="kwrd">new</span> StringBuilder(txt);</pre>
          <pre class="alt">
            <span class="lnum"> 89: </span> </pre>
          <pre>
            <span class="lnum"> 90: </span>
            <span class="rem">//escape \,", and {}</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 91: </span> sb.Replace(qChr, qChr + qChr);</pre>
          <pre>
            <span class="lnum"> 92: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 93: </span>
            <span class="rem">//process the passed
string (txt), one line at a time</span>
          </pre>
          <pre>
            <span class="lnum"> 94: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 95: </span>
            <span class="rem">//dump the stringbuilder
into a temp string</span>
          </pre>
          <pre>
            <span class="lnum"> 96: </span>
            <span class="kwrd">string</span> fullString =
sb.ToString();</pre>
          <pre class="alt">
            <span class="lnum"> 97: </span> sb.Clear(); <span class="rem">//lovely
.net 4 - sb.Remove(0, sb.Length);</span></pre>
          <pre>
            <span class="lnum"> 98: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 99: </span>
            <span class="rem">//the original
was horrible WTF code</span>
          </pre>
          <pre>
            <span class="lnum"> 100: </span>
            <span class="kwrd">using</span> (var reader
= <span class="kwrd">new</span> StringReader(fullString))</pre>
          <pre class="alt">
            <span class="lnum"> 101: </span> {</pre>
          <pre>
            <span class="lnum"> 102: </span>
            <span class="kwrd">string</span> line;</pre>
          <pre class="alt">
            <span class="lnum"> 103: </span>
            <span class="kwrd">while</span> ((line
= reader.ReadLine()) != <span class="kwrd">null</span>)</pre>
          <pre>
            <span class="lnum"> 104: </span> {</pre>
          <pre class="alt">
            <span class="lnum"> 105: </span> sb.Append(sbName + <span class="str">".AppendLine("</span>);</pre>
          <pre>
            <span class="lnum"> 106: </span> sb.Append(<span class="str">"@"</span> + qChr);</pre>
          <pre class="alt">
            <span class="lnum"> 107: </span> sb.Append(line.Replace(<span class="str">"\t"</span>, <span class="str">"\\t"</span>));</pre>
          <pre>
            <span class="lnum"> 108: </span> sb.AppendLine(qChr + <span class="str">");"</span>);</pre>
          <pre class="alt">
            <span class="lnum"> 109: </span> }</pre>
          <pre>
            <span class="lnum"> 110: </span> }</pre>
          <pre class="alt">
            <span class="lnum"> 111: </span> </pre>
          <pre>
            <span class="lnum"> 112: </span>
            <span class="rem">//TODO: Better '@"" + ' replacement
to not cover inside strings</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 113: </span> sb.Replace(<span class="str">"@"</span> +
qChr + qChr + <span class="str">" + "</span>, <span class="str">""</span>);</pre>
          <pre>
            <span class="lnum"> 114: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 115: </span>
            <span class="rem">//add the dec
statement</span>
          </pre>
          <pre>
            <span class="lnum"> 116: </span> sb.Insert(0, <span class="str">"StringBuilder
"</span> + sbName + <span class="str">" = new StringBuilder("</span> + txt.Length
+ <span class="str">");"</span> + Environment.NewLine);</pre>
          <pre class="alt">
            <span class="lnum"> 117: </span> </pre>
          <pre>
            <span class="lnum"> 118: </span>
            <span class="rem">//and return</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 119: </span>
            <span class="kwrd">return</span> sb.ToString();</pre>
          <pre>
            <span class="lnum"> 120: </span> }</pre>
          <pre class="alt">
            <span class="lnum"> 121: </span>
            <span class="preproc">#endregion</span>
          </pre>
          <pre>
            <span class="lnum"> 122: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 123: </span>
            <span class="rem">/// &lt;summary&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 124: </span>
            <span class="rem">/// Inserts text at current
cursor location in the application</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 125: </span>
            <span class="rem">/// &lt;/summary&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 126: </span>
            <span class="rem">/// &lt;param name="application"&gt;application
with activewindow&lt;/param&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 127: </span>
            <span class="rem">/// &lt;param
name="text"&gt;text to insert&lt;/param&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 128: </span>
            <span class="kwrd">private</span>
            <span class="kwrd">static</span>
            <span class="kwrd">void</span> Paste(DTE2
application, <span class="kwrd">string</span> text)</pre>
          <pre class="alt">
            <span class="lnum"> 129: </span> {</pre>
          <pre>
            <span class="lnum"> 130: </span>
            <span class="rem">//get the text document</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 131: </span> var txt = (TextDocument)application.ActiveDocument.Object(<span class="str">"TextDocument"</span>);</pre>
          <pre>
            <span class="lnum"> 132: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 133: </span>
            <span class="rem">//get an edit
point</span>
          </pre>
          <pre>
            <span class="lnum"> 134: </span> EditPoint ep = txt.Selection.ActivePoint.CreateEditPoint();</pre>
          <pre class="alt">
            <span class="lnum"> 135: </span> </pre>
          <pre>
            <span class="lnum"> 136: </span>
            <span class="rem">//get a start point</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 137: </span> EditPoint sp = txt.Selection.ActivePoint.CreateEditPoint();</pre>
          <pre>
            <span class="lnum"> 138: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 139: </span>
            <span class="rem">//open the undo
context</span>
          </pre>
          <pre>
            <span class="lnum"> 140: </span>
            <span class="kwrd">bool</span> isOpen = application.UndoContext.IsOpen;</pre>
          <pre class="alt">
            <span class="lnum"> 141: </span>
            <span class="kwrd">if</span> (!isOpen)</pre>
          <pre>
            <span class="lnum"> 142: </span> application.UndoContext.Open(<span class="str">"SmartPaster"</span>);</pre>
          <pre class="alt">
            <span class="lnum"> 143: </span> </pre>
          <pre>
            <span class="lnum"> 144: </span>
            <span class="rem">//clear the selection</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 145: </span>
            <span class="kwrd">if</span> (!txt.Selection.IsEmpty)</pre>
          <pre>
            <span class="lnum"> 146: </span> txt.Selection.Delete();</pre>
          <pre class="alt">
            <span class="lnum"> 147: </span> </pre>
          <pre>
            <span class="lnum"> 148: </span>
            <span class="rem">//insert the text</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 149: </span>
            <span class="rem">//ep.Insert(Indent(text,
ep.LineCharOffset))</span>
          </pre>
          <pre>
            <span class="lnum"> 150: </span> ep.Insert(text);</pre>
          <pre class="alt">
            <span class="lnum"> 151: </span> </pre>
          <pre>
            <span class="lnum"> 152: </span>
            <span class="rem">//smart format</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 153: </span> sp.SmartFormat(ep);</pre>
          <pre>
            <span class="lnum"> 154: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 155: </span>
            <span class="rem">//close the context</span>
          </pre>
          <pre>
            <span class="lnum"> 156: </span>
            <span class="kwrd">if</span> (!isOpen)</pre>
          <pre class="alt">
            <span class="lnum"> 157: </span> application.UndoContext.Close();</pre>
          <pre>
            <span class="lnum"> 158: </span> }</pre>
          <pre class="alt">
            <span class="lnum"> 159: </span> </pre>
          <pre>
            <span class="lnum"> 160: </span>
            <span class="preproc">#region</span>
            <span class="str">"Paste
As ..."</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 161: </span> </pre>
          <pre>
            <span class="lnum"> 162: </span>
            <span class="rem">/// &lt;summary&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 163: </span>
            <span class="rem">/// Public method
to paste and format clipboard text as string the cursor </span>
          </pre>
          <pre>
            <span class="lnum"> 164: </span>
            <span class="rem">/// location for the configured
or active window's langage .</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 165: </span>
            <span class="rem">/// &lt;/summary&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 166: </span>
            <span class="rem">/// &lt;param name="application"&gt;application
to insert&lt;/param&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 167: </span>
            <span class="kwrd">public</span>
            <span class="kwrd">void</span> PasteAsString(DTE2
application)</pre>
          <pre>
            <span class="lnum"> 168: </span> {</pre>
          <pre class="alt">
            <span class="lnum"> 169: </span> Paste(application, StringinizeInCs(ClipboardText));</pre>
          <pre>
            <span class="lnum"> 170: </span> }</pre>
          <pre class="alt">
            <span class="lnum"> 171: </span> </pre>
          <pre>
            <span class="lnum"> 172: </span>
            <span class="rem">/// &lt;summary&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 173: </span>
            <span class="rem">/// Public method
to paste and format clipboard text as comment the cursor </span>
          </pre>
          <pre>
            <span class="lnum"> 174: </span>
            <span class="rem">/// location for the configured
or active window's langage .</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 175: </span>
            <span class="rem">/// &lt;/summary&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 176: </span>
            <span class="rem">/// &lt;param name="application"&gt;application
to insert&lt;/param&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 177: </span>
            <span class="kwrd">public</span>
            <span class="kwrd">void</span> PasteAsComment(DTE2
application)</pre>
          <pre>
            <span class="lnum"> 178: </span> {</pre>
          <pre class="alt">
            <span class="lnum"> 179: </span> Paste(application, CommentizeInCs(ClipboardText));</pre>
          <pre>
            <span class="lnum"> 180: </span> }</pre>
          <pre class="alt">
            <span class="lnum"> 181: </span> </pre>
          <pre>
            <span class="lnum"> 182: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 183: </span>
            <span class="rem">/// &lt;summary&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 184: </span>
            <span class="rem">/// Public method to paste
format clipboard text into a specified region</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 185: </span>
            <span class="rem">/// &lt;/summary&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 186: </span>
            <span class="rem">/// &lt;param name="application"&gt;application
to insert&lt;/param&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 187: </span>
            <span class="kwrd">public</span>
            <span class="kwrd">void</span> PasteAsRegion(DTE2
application)</pre>
          <pre>
            <span class="lnum"> 188: </span> {</pre>
          <pre class="alt">
            <span class="lnum"> 189: </span>
            <span class="rem">//get the region
name</span>
          </pre>
          <pre>
            <span class="lnum"> 190: </span>
            <span class="kwrd">const</span>
            <span class="kwrd">string</span> region
= <span class="str">"myRegion"</span>;</pre>
          <pre class="alt">
            <span class="lnum"> 191: </span> </pre>
          <pre>
            <span class="lnum"> 192: </span>
            <span class="rem">//it's so simple, we really
don't need a function</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 193: </span>
            <span class="kwrd">string</span> csRegionized
= <span class="str">"#region "</span> + region + Environment.NewLine + ClipboardText
+ Environment.NewLine + <span class="str">"#endregion"</span>;</pre>
          <pre>
            <span class="lnum"> 194: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 195: </span>
            <span class="rem">//and paste</span>
          </pre>
          <pre>
            <span class="lnum"> 196: </span> Paste(application, csRegionized);</pre>
          <pre class="alt">
            <span class="lnum"> 197: </span> }</pre>
          <pre>
            <span class="lnum"> 198: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 199: </span>
            <span class="rem">/// &lt;summary&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 200: </span>
            <span class="rem">/// Public method to paste
and format clipboard text as stringbuilder the cursor </span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 201: </span>
            <span class="rem">/// location for
the configured or active window's langage .</span>
          </pre>
          <pre>
            <span class="lnum"> 202: </span>
            <span class="rem">/// &lt;/summary&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 203: </span>
            <span class="rem">/// &lt;param
name="application"&gt;application to insert&lt;/param&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 204: </span>
            <span class="kwrd">public</span>
            <span class="kwrd">void</span> PasteAsStringBuilder(DTE2
application)</pre>
          <pre class="alt">
            <span class="lnum"> 205: </span> {</pre>
          <pre>
            <span class="lnum"> 206: </span>
            <span class="kwrd">const</span>
            <span class="kwrd">string</span> stringbuilder
= <span class="str">"sb"</span>;</pre>
          <pre class="alt">
            <span class="lnum"> 207: </span> Paste(application, StringbuilderizeInCs(ClipboardText,
stringbuilder));</pre>
          <pre>
            <span class="lnum"> 208: </span> }</pre>
          <pre class="alt">
            <span class="lnum"> 209: </span> </pre>
          <pre>
            <span class="lnum"> 210: </span>
            <span class="preproc">#endregion</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 211: </span> }</pre>
          <pre>
            <span class="lnum"> 212: </span>}</pre>
        </div>
        <style type="text/css">

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
        <img width="0" height="0" src="http://martinwilley.com/blog/aggbug.ashx?id=3c13f5c7-17e1-42e1-be64-3e4bea605a5a" />
      </body>
      <title>Smart Paste in 2010</title>
      <guid isPermaLink="false">http://martinwilley.com/blog/PermaLink,guid,3c13f5c7-17e1-42e1-be64-3e4bea605a5a.aspx</guid>
      <link>http://martinwilley.com/blog/2010/06/06/SmartPasteIn2010.aspx</link>
      <pubDate>Sun, 06 Jun 2010 15:30:02 GMT</pubDate>
      <description>&lt;p&gt;
One of the really useful Visual Studio add-ins is &lt;a href="http://weblogs.asp.net/alex_papadimoulis/archive/2004/05/25/Smart-Paster-1.1-Add-In---StringBuilder-and-Better-C_2300_-Handling.aspx" target="_blank"&gt;Smart
Paster&lt;/a&gt;. It adds a "Paste As." context menu that allows you to paste in the clipboard
text as a comment, a correctly quoted string or a string builder.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.martinwilley.com/blog/content/binary/SmartPastein2010_E81F/smartpaster.png"&gt;&lt;img style="border-width: 0px; display: inline;" title="smartpaster" alt="smartpaster" src="http://www.martinwilley.com/blog/content/binary/SmartPastein2010_E81F/smartpaster_thumb.png" height="46" border="0" width="244"&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
There are versions for VS 2003, 2005 and 2008. But not 2010.
&lt;/p&gt;
&lt;p&gt;
Sometimes you can just copy in the dll and addin file into the VS 2010 Addins folder
(.\Documents\Visual Studio 2010\Addins) and edit the addin file (it's just xml) to
say "10.0" instead of "9.0". But that doesn't work for SmartPaster - VS 2010 shows
an error and insists on disabling the addin.
&lt;/p&gt;
&lt;p&gt;
The VS 2008 download includes the source, so I tried to upgrade it.
&lt;/p&gt;
&lt;p&gt;
It turns out the problem is when it creates the context menus it sets the CommandBarButton.FaceId
property (to show an image next to the text). But in VS2010 that throws a DeprecatedException. 
&lt;/p&gt;
&lt;p&gt;
Ok, simple fix, but the original source is old code with a fairly high WTF-per-line
ratio (well, it was written 2004, .Net 1.1). Before long I had ported it from VB.Net
to C# (thanks &lt;a href="http://converter.telerik.com/" target="_blank"&gt;Telerik&lt;/a&gt;)
and rewritten large parts (mostly refactoring with Coderush). I simplified by dropping
the "regionize" stuff (never use it), the VB support and the configuration form. Here's
my code- you can create a new Extensibility Addin project, replace the Connect class
and add the SmartPaster class- see below.
&lt;/p&gt;
&lt;p&gt;
It's still a port, so certainly not as clean as something just written from scratch.
And perhaps VS2010 has nicer ways of doing all these things now the code window is
a WPF control - the EnvDTE objects are ugly and hard to use. Anyway, thanks to Alex
Papadimoulis for the original code.
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;&lt;font color="#ff0000"&gt;Update: &lt;a href="http://www.martinwilley.com/download/?p=sp2010"&gt;download
the binary&lt;/a&gt; and unzip into your Addins folder.&lt;/font&gt;&lt;/b&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;&lt;font color="#FF0000"&gt;Update 2: source and binary are also on&lt;/font&gt; &lt;font color="#000080"&gt;&lt;a href="http://smartpaster2010.codeplex.com/"&gt;Codeplex&lt;/a&gt;&lt;/font&gt;&lt;/b&gt;.&lt;font color="#FF0000"&gt; (It's
exactly the same as shown here.)&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font color="#FF0000"&gt;&lt;b&gt;Update 3 (March 2012): The &lt;a href="http://smartpaster2010.codeplex.com/"&gt;Codeplex
version&lt;/a&gt; is updated to support VB.Net and is compatible with Visual Studio 11&lt;/b&gt;&lt;/font&gt;
&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;br&gt;
&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 1: &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 2: &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Collections;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 3: &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; EnvDTE;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 4: &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; EnvDTE80;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 5: &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Extensibility;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 6: &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.VisualStudio.CommandBars;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 7: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 8: &lt;/span&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; SmartPaster2010&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 9: &lt;/span&gt;{&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 10: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;summary&amp;gt;The object
for implementing an Add-in.&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 11: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;seealso
class='IDTExtensibility2' /&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 12: &lt;/span&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Connect
: IDTExtensibility2&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 13: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 14: &lt;/span&gt; &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;readonly&lt;/span&gt; ArrayList
_pasteAsButtons;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 15: &lt;/span&gt; &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;readonly&lt;/span&gt; SmartPaster
_smartPaster;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 16: &lt;/span&gt; &lt;span class="kwrd"&gt;private&lt;/span&gt; CommandBarPopup
_pasteAsPopup;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 17: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 18: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;summary&amp;gt;Implements
the constructor for the Add-in object. Place your initialization code within this
method.&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 19: &lt;/span&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; Connect()&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 20: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 21: &lt;/span&gt; _pasteAsButtons = &lt;span class="kwrd"&gt;new&lt;/span&gt; ArrayList();&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 22: &lt;/span&gt; _smartPaster = &lt;span class="kwrd"&gt;new&lt;/span&gt; SmartPaster();&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 23: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 24: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 25: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;summary&amp;gt;Implements
the OnConnection method of the IDTExtensibility2 interface. Receives notification
that the Add-in is being loaded.&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 26: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;param term='application'&amp;gt;Root
object of the host application.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 27: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;param term='connectMode'&amp;gt;Describes
how the Add-in is being loaded.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 28: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;param term='addInInst'&amp;gt;Object
representing this Add-in.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 29: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;seealso
class='IDTExtensibility2' /&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 30: &lt;/span&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; OnConnection(&lt;span class="kwrd"&gt;object&lt;/span&gt; application,
ext_ConnectMode connectMode, &lt;/pre&gt;
&lt;pre&gt;&lt;span class="kwrd"&gt;object&lt;/span&gt; addInInst, &lt;span class="kwrd"&gt;ref&lt;/span&gt; Array
custom)&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 31: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 32: &lt;/span&gt; _applicationObject = (DTE2)application;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 33: &lt;/span&gt; _addInInstance = (AddIn)addInInst;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 34: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 35: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 36: &lt;/span&gt; &lt;span class="rem"&gt;//check for the commands&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 37: &lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; cmdExists
= &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 38: &lt;/span&gt; &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (Command cmd &lt;span class="kwrd"&gt;in&lt;/span&gt; _applicationObject.Commands)&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 39: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 40: &lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (cmd.Name.EndsWith(&lt;span class="str"&gt;"PasteAsComment"&lt;/span&gt;,
StringComparison.OrdinalIgnoreCase))&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 41: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 42: &lt;/span&gt; cmdExists = &lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 43: &lt;/span&gt; &lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 44: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 45: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 46: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 47: &lt;/span&gt; &lt;span class="kwrd"&gt;try&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 48: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 49: &lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (!cmdExists)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 50: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 51: &lt;/span&gt; AddPasteAsCommands();&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 52: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 53: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 54: &lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (connectMode ==
ext_ConnectMode.ext_cm_Startup &amp;amp;&amp;amp; _pasteAsPopup == &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 55: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 56: &lt;/span&gt; &lt;span class="rem"&gt;//Add items to the Context
(Right-Click) Menu&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 57: &lt;/span&gt; &lt;span class="rem"&gt;//find the position
of the &amp;amp;Paste command&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 58: &lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; position = 0;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 59: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 60: &lt;/span&gt; CommandBar codeWindow = _applicationObject.CommandBars[&lt;span class="str"&gt;"Code
Window"&lt;/span&gt;];&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 61: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 62: &lt;/span&gt; &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i
= 1; i &amp;lt;= codeWindow.Controls.Count; i++)&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 63: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 64: &lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (codeWindow.Controls[i].Caption
== &lt;span class="str"&gt;"&amp;amp;Paste"&lt;/span&gt;)&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 65: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 66: &lt;/span&gt; position = i;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 67: &lt;/span&gt; &lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 68: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 69: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 70: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 71: &lt;/span&gt; &lt;span class="rem"&gt;//add the popup
menu "Paste As...", which may already be on the menu&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 72: &lt;/span&gt; _pasteAsPopup = (CommandBarPopup)codeWindow.Controls.Add(&lt;/pre&gt;
&lt;pre&gt;(&lt;span class="kwrd"&gt;int&lt;/span&gt;)MsoControlType.msoControlPopup, 1, Type.Missing,
position + 1, Type.Missing);&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 73: &lt;/span&gt; _pasteAsPopup.Caption = &lt;span class="str"&gt;"Paste
As ..."&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 74: &lt;/span&gt; AddPasteAsButtons();&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 75: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 76: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 77: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 78: &lt;/span&gt; &lt;span class="kwrd"&gt;catch&lt;/span&gt; (Exception ex)&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 79: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 80: &lt;/span&gt; System.Diagnostics.Debug.WriteLine(ex.Message);&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 81: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 82: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 83: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 84: &lt;/span&gt; &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; AddPasteAsCommands()&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 85: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 86: &lt;/span&gt; &lt;span class="rem"&gt;//no configure or regionize
because I never use 'em&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 87: &lt;/span&gt; _applicationObject.Commands.AddNamedCommand(_addInInstance, &lt;span class="str"&gt;"PasteAsComment"&lt;/span&gt;, &lt;span class="str"&gt;"Paste
As Comment"&lt;/span&gt;, &lt;span class="str"&gt;"Pastes clipboard text as a comment."&lt;/span&gt;, &lt;span class="kwrd"&gt;true&lt;/span&gt;,
22, &lt;span class="kwrd"&gt;null&lt;/span&gt;, Convert.ToInt32(vsCommandStatus.vsCommandStatusSupported)
+ Convert.ToInt32(vsCommandStatus.vsCommandStatusEnabled));&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 88: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 89: &lt;/span&gt; _applicationObject.Commands.AddNamedCommand(_addInInstance, &lt;span class="str"&gt;"PasteAsString"&lt;/span&gt;, &lt;span class="str"&gt;"Paste
As String"&lt;/span&gt;, &lt;span class="str"&gt;"Pastes clipboard text as a string literal."&lt;/span&gt;, &lt;span class="kwrd"&gt;true&lt;/span&gt;,
22, &lt;span class="kwrd"&gt;null&lt;/span&gt;, Convert.ToInt32(vsCommandStatus.vsCommandStatusSupported)
+ Convert.ToInt32(vsCommandStatus.vsCommandStatusEnabled));&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 90: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 91: &lt;/span&gt; _applicationObject.Commands.AddNamedCommand(_addInInstance, &lt;span class="str"&gt;"PasteAsStringBuilder"&lt;/span&gt;, &lt;span class="str"&gt;"Paste
As StringBuilder"&lt;/span&gt;, &lt;span class="str"&gt;"Pastes clipboard text as a stringbuilder."&lt;/span&gt;, &lt;span class="kwrd"&gt;true&lt;/span&gt;,
22, &lt;span class="kwrd"&gt;null&lt;/span&gt;, Convert.ToInt32(vsCommandStatus.vsCommandStatusSupported)
+ Convert.ToInt32(vsCommandStatus.vsCommandStatusEnabled));&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 92: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 93: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 94: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 95: &lt;/span&gt; &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; AddPasteAsButtons()&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 96: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 97: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 98: &lt;/span&gt; &lt;span class="rem"&gt;//now the buttons&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 99: &lt;/span&gt; CommandBarButton pasteAsButton;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 100: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 101: &lt;/span&gt; &lt;span class="rem"&gt;//add "Comment"&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 102: &lt;/span&gt; pasteAsButton = AddCommandButton();&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 103: &lt;/span&gt; pasteAsButton.Caption = &lt;span class="str"&gt;"Comment"&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 104: &lt;/span&gt; pasteAsButton.TooltipText = &lt;span class="str"&gt;"Inserts
clipboard with each line prefixed with a comment character"&lt;/span&gt;;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 105: &lt;/span&gt; pasteAsButton.Click += PasteAsComment;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 106: &lt;/span&gt; _pasteAsButtons.Add(pasteAsButton);&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 107: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 108: &lt;/span&gt; &lt;span class="rem"&gt;//add "String"&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 109: &lt;/span&gt; pasteAsButton = AddCommandButton();&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 110: &lt;/span&gt; pasteAsButton.Caption = &lt;span class="str"&gt;"String"&lt;/span&gt;;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 111: &lt;/span&gt; pasteAsButton.TooltipText = &lt;span class="str"&gt;"Inserts
enquoted clipboard text with line breaks and other characters escaped"&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 112: &lt;/span&gt; pasteAsButton.Click += PasteAsString;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 113: &lt;/span&gt; _pasteAsButtons.Add(pasteAsButton);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 114: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 115: &lt;/span&gt; &lt;span class="rem"&gt;//add "StringBuilder"&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 116: &lt;/span&gt; pasteAsButton = AddCommandButton();&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 117: &lt;/span&gt; pasteAsButton.Caption = &lt;span class="str"&gt;"StringBuilder"&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 118: &lt;/span&gt; pasteAsButton.TooltipText = &lt;span class="str"&gt;"Inserts
enquoted clipboard text built up by a stringbuilder."&lt;/span&gt;;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 119: &lt;/span&gt; pasteAsButton.Click += PasteAsStringBuilder;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 120: &lt;/span&gt; _pasteAsButtons.Add(pasteAsButton);&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 121: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 122: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 123: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 124: &lt;/span&gt; &lt;span class="kwrd"&gt;private&lt;/span&gt; CommandBarButton
AddCommandButton()&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 125: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 126: &lt;/span&gt; var pasteAsButton = (CommandBarButton)_pasteAsPopup.Controls.Add((&lt;span class="kwrd"&gt;int&lt;/span&gt;)MsoControlType.msoControlButton);&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 127: &lt;/span&gt; &lt;span class="rem"&gt;//in 2010, CommandBarButton.FaceId
throws a DeprecatedException.&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 128: &lt;/span&gt; &lt;span class="rem"&gt;//pasteAsButton.FaceId = 22;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 129: &lt;/span&gt; pasteAsButton.Visible = &lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 130: &lt;/span&gt; &lt;span class="kwrd"&gt;return&lt;/span&gt; pasteAsButton;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 131: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 132: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 133: &lt;/span&gt; &lt;span class="preproc"&gt;#region&lt;/span&gt; &lt;span class="str"&gt;"PasteAs
Handlers"&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 134: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 135: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 136: &lt;/span&gt; &lt;span class="rem"&gt;///Occurs when the user clicks
the PasteAsString button.&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 137: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 138: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;param name="ctrl"&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 139: &lt;/span&gt; &lt;span class="rem"&gt;///Denotes the
CommandBarButton control that initiated the event. &lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 140: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 141: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;param name="cancelDefault"&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 142: &lt;/span&gt; &lt;span class="rem"&gt;///False if the default behavior
associated with the CommandBarButton control occurs, unless its canceled by another
process or add-in. &lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 143: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 144: &lt;/span&gt; &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; PasteAsString(CommandBarButton
ctrl, &lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; cancelDefault)&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 145: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 146: &lt;/span&gt; _smartPaster.PasteAsString(_applicationObject);&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 147: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 148: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 149: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 150: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 151: &lt;/span&gt; &lt;span class="rem"&gt;///Occurs when
the user clicks the PasteAsComment button.&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 152: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 153: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;param name="ctrl"&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 154: &lt;/span&gt; &lt;span class="rem"&gt;///Denotes the CommandBarButton
control that initiated the event. &lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 155: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 156: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;param name="cancelDefault"&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 157: &lt;/span&gt; &lt;span class="rem"&gt;///False if the
default behavior associated with the CommandBarButton control occurs, unless its canceled
by another process or add-in. &lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 158: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 159: &lt;/span&gt; &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; PasteAsComment(CommandBarButton
ctrl, &lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; cancelDefault)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 160: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 161: &lt;/span&gt; _smartPaster.PasteAsComment(_applicationObject);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 162: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 163: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 164: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 165: &lt;/span&gt; &lt;span class="rem"&gt;///Occurs when
the user clicks the PasteAsStringBuilder button.&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 166: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 167: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;param name="ctrl"&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 168: &lt;/span&gt; &lt;span class="rem"&gt;///Denotes the CommandBarButton
control that initiated the event. &lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 169: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 170: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;param name="cancelDefault"&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 171: &lt;/span&gt; &lt;span class="rem"&gt;///False if the
default behavior associated with the CommandBarButton control occurs, unless its canceled
by another process or add-in. &lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 172: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 173: &lt;/span&gt; &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; PasteAsStringBuilder(CommandBarButton
ctrl, &lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; cancelDefault)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 174: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 175: &lt;/span&gt; _smartPaster.PasteAsStringBuilder(_applicationObject);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 176: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 177: &lt;/span&gt; &lt;span class="preproc"&gt;#endregion&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 178: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 179: &lt;/span&gt; &lt;span class="preproc"&gt;#region&lt;/span&gt; &lt;span class="str"&gt;"Exec"&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 180: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 181: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 182: &lt;/span&gt; &lt;span class="rem"&gt;/// Implements the Exec method
of the IDTCommandTarget interface.&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 183: &lt;/span&gt; &lt;span class="rem"&gt;/// This is called
when the command is invoked.&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 184: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 185: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;param name='commandName'&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 186: &lt;/span&gt; &lt;span class="rem"&gt;/// The name of the command
to execute.&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 187: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 188: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;param name='executeOption'&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 189: &lt;/span&gt; &lt;span class="rem"&gt;/// Describes
how the command should be run.&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 190: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 191: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;param name='varIn'&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 192: &lt;/span&gt; &lt;span class="rem"&gt;/// Parameters passed from
the caller to the command handler.&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 193: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 194: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;param name='varOut'&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 195: &lt;/span&gt; &lt;span class="rem"&gt;/// Parameters
passed from the command handler to the caller.&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 196: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 197: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;param name='handled'&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 198: &lt;/span&gt; &lt;span class="rem"&gt;/// Informs the caller if
the command was handled or not.&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 199: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 200: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;seealso class='Exec'
/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 201: &lt;/span&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Exec(&lt;span class="kwrd"&gt;string&lt;/span&gt; commandName,
vsCommandExecOption executeOption, &lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt; varIn, &lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt; varOut, &lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; handled)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 202: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 203: &lt;/span&gt; handled = &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 204: &lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; ((executeOption
== vsCommandExecOption.vsCommandExecOptionDoDefault))&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 205: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 206: &lt;/span&gt; handled = &lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 207: &lt;/span&gt; &lt;span class="kwrd"&gt;switch&lt;/span&gt; (commandName)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 208: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 209: &lt;/span&gt; &lt;span class="rem"&gt;//case "SmartPaster.Connect.Configure":&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 210: &lt;/span&gt; &lt;span class="rem"&gt;// //show the config form&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 211: &lt;/span&gt; &lt;span class="rem"&gt;// SmartPasterForm
myForm = new SmartPasterForm();&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 212: &lt;/span&gt; &lt;span class="rem"&gt;// myForm.ShowDialog();&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 213: &lt;/span&gt; &lt;span class="rem"&gt;// //since config
may have changed, show/hide buttons&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 214: &lt;/span&gt; &lt;span class="rem"&gt;// EnableContextMenuButtons();&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 215: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 216: &lt;/span&gt; &lt;span class="rem"&gt;// break;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 217: &lt;/span&gt; &lt;span class="kwrd"&gt;case&lt;/span&gt; &lt;span class="str"&gt;"SmartPaster.Connect.PasteAsComment"&lt;/span&gt;:&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 218: &lt;/span&gt; _smartPaster.PasteAsComment(_applicationObject);&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 219: &lt;/span&gt; &lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 220: &lt;/span&gt; &lt;span class="kwrd"&gt;case&lt;/span&gt; &lt;span class="str"&gt;"SmartPaster.Connect.PasteAsString"&lt;/span&gt;:&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 221: &lt;/span&gt; _smartPaster.PasteAsString(_applicationObject);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 222: &lt;/span&gt; &lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 223: &lt;/span&gt; &lt;span class="kwrd"&gt;case&lt;/span&gt; &lt;span class="str"&gt;"SmartPaster.Connect.PasteAsStringBuilder"&lt;/span&gt;:&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 224: &lt;/span&gt; _smartPaster.PasteAsStringBuilder(_applicationObject);&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 225: &lt;/span&gt; &lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 226: &lt;/span&gt; &lt;span class="rem"&gt;//case "SmartPaster.Connect.PasteAsRegion":&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 227: &lt;/span&gt; &lt;span class="rem"&gt;// _smartPaster.PasteAsRegion(_applicationObject);&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 228: &lt;/span&gt; &lt;span class="rem"&gt;// break;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 229: &lt;/span&gt; &lt;span class="kwrd"&gt;default&lt;/span&gt;:&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 230: &lt;/span&gt; handled = &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 231: &lt;/span&gt; &lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 232: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 233: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 234: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 235: &lt;/span&gt; &lt;span class="preproc"&gt;#endregion&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 236: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 237: &lt;/span&gt; &lt;span class="preproc"&gt;#region&lt;/span&gt; Standard
Template Stuff&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 238: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 239: &lt;/span&gt; &lt;span class="rem"&gt;///Implements
the OnDisconnection method of the IDTExtensibility2 interface. Receives notification
that the Add-in is being unloaded.&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 240: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 241: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;param name="disconnectMode"&amp;gt;The
disconnect mode.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 242: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;param name="custom"&amp;gt;The
custom.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 243: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;seealso
class="IDTExtensibility2"/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 244: &lt;/span&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; OnDisconnection(ext_DisconnectMode
disconnectMode, &lt;span class="kwrd"&gt;ref&lt;/span&gt; Array custom)&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 245: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 246: &lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (_pasteAsPopup
!= &lt;span class="kwrd"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; &lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 247: &lt;/span&gt; (disconnectMode == ext_DisconnectMode.ext_dm_UserClosed
|| disconnectMode == ext_DisconnectMode.ext_dm_HostShutdown))&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 248: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 249: &lt;/span&gt; _pasteAsPopup.Delete(&lt;span class="kwrd"&gt;true&lt;/span&gt;);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 250: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 251: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 252: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 253: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;summary&amp;gt;Implements
the OnAddInsUpdate method of the IDTExtensibility2 interface. Receives notification
when the collection of Add-ins has changed.&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 254: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;param term='custom'&amp;gt;Array
of parameters that are host application specific.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 255: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;seealso
class='IDTExtensibility2' /&amp;gt; &lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 256: &lt;/span&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; OnAddInsUpdate(&lt;span class="kwrd"&gt;ref&lt;/span&gt; Array
custom)&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 257: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 258: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 259: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 260: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;summary&amp;gt;Implements
the OnStartupComplete method of the IDTExtensibility2 interface. Receives notification
that the host application has completed loading.&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 261: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;param term='custom'&amp;gt;Array
of parameters that are host application specific.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 262: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;seealso class='IDTExtensibility2'
/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 263: &lt;/span&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; OnStartupComplete(&lt;span class="kwrd"&gt;ref&lt;/span&gt; Array
custom)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 264: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 265: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 266: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 267: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;summary&amp;gt;Implements
the OnBeginShutdown method of the IDTExtensibility2 interface. Receives notification
that the host application is being unloaded.&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 268: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;param term='custom'&amp;gt;Array
of parameters that are host application specific.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 269: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;seealso
class='IDTExtensibility2' /&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 270: &lt;/span&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; OnBeginShutdown(&lt;span class="kwrd"&gt;ref&lt;/span&gt; Array
custom)&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 271: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 272: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 273: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 274: &lt;/span&gt; &lt;span class="kwrd"&gt;private&lt;/span&gt; DTE2 _applicationObject;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 275: &lt;/span&gt; &lt;span class="kwrd"&gt;private&lt;/span&gt; AddIn
_addInInstance;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 276: &lt;/span&gt; &lt;span class="preproc"&gt;#endregion&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 277: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 278: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 279: &lt;/span&gt; &lt;span class="rem"&gt;///Queries the
status.&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 280: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 281: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;param name="commandName"&amp;gt;Name
of the command.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 282: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;param name="neededText"&amp;gt;The
needed text.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 283: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;param name="statusOption"&amp;gt;The
status option.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 284: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;param name="commandText"&amp;gt;The
command text.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 285: &lt;/span&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; QueryStatus(&lt;span class="kwrd"&gt;string&lt;/span&gt; commandName,
vsCommandStatusTextWanted neededText, &lt;span class="kwrd"&gt;ref&lt;/span&gt; vsCommandStatus
statusOption, &lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt; commandText)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 286: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 287: &lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (neededText
== vsCommandStatusTextWanted.vsCommandStatusTextWantedNone)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 288: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 289: &lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (commandName.StartsWith(&lt;span class="str"&gt;"SmartPaster.Connect"&lt;/span&gt;))&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 290: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 291: &lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (((_applicationObject.ActiveDocument
!= &lt;span class="kwrd"&gt;null&lt;/span&gt;)) &amp;amp;&amp;amp; ((_applicationObject.ActiveDocument.Object(&lt;span class="str"&gt;"TextDocument"&lt;/span&gt;)
!= &lt;span class="kwrd"&gt;null&lt;/span&gt;)))&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 292: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 293: &lt;/span&gt; statusOption = vsCommandStatus.vsCommandStatusEnabled
| vsCommandStatus.vsCommandStatusSupported;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 294: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 295: &lt;/span&gt; &lt;span class="kwrd"&gt;else&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 296: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 297: &lt;/span&gt; statusOption = vsCommandStatus.vsCommandStatusSupported;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 298: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 299: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 300: &lt;/span&gt; &lt;span class="kwrd"&gt;else&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 301: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 302: &lt;/span&gt; statusOption = vsCommandStatus.vsCommandStatusUnsupported;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 303: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 304: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 305: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 306: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 307: &lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;
&lt;p&gt;
Here's the SmartPaster class.
&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 1: &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 2: &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.IO;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 3: &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Text;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 4: &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Windows.Forms; &lt;span class="rem"&gt;//clipboard&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 5: &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; EnvDTE;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 6: &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; EnvDTE80;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 7: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 8: &lt;/span&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; SmartPaster2010&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 9: &lt;/span&gt;{&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 10: &lt;/span&gt; &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 11: &lt;/span&gt; &lt;span class="rem"&gt;/// Class responsible
for doing the pasting/manipulating of clipdata.&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 12: &lt;/span&gt; &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 13: &lt;/span&gt; &lt;span class="kwrd"&gt;internal&lt;/span&gt; &lt;span class="kwrd"&gt;sealed&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; SmartPaster&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 14: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 15: &lt;/span&gt; &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 16: &lt;/span&gt; &lt;span class="rem"&gt;/// Convient property to retrieve
the clipboard text from the clipboard&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 17: &lt;/span&gt; &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 18: &lt;/span&gt; &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; ClipboardText&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 19: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 20: &lt;/span&gt; get&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 21: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 22: &lt;/span&gt; IDataObject iData = Clipboard.GetDataObject();&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 23: &lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (iData.GetDataPresent(DataFormats.Text))&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 24: &lt;/span&gt; &lt;span class="kwrd"&gt;return&lt;/span&gt; Convert.ToString(iData.GetData(DataFormats.Text));&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 25: &lt;/span&gt; &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt;.Empty;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 26: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 27: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 28: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 29: &lt;/span&gt; &lt;span class="preproc"&gt;#region&lt;/span&gt; &lt;span class="str"&gt;"Stringinize"&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 30: &lt;/span&gt; &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 31: &lt;/span&gt; &lt;span class="rem"&gt;/// Stringinizes
text passed to it for use in C#&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 32: &lt;/span&gt; &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 33: &lt;/span&gt; &lt;span class="rem"&gt;/// &amp;lt;param name="txt"&amp;gt;Text
to be Stringinized&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 34: &lt;/span&gt; &lt;span class="rem"&gt;/// &amp;lt;returns&amp;gt;C# Stringinized
text&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 35: &lt;/span&gt; &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; StringinizeInCs(&lt;span class="kwrd"&gt;string&lt;/span&gt; txt)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 36: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 37: &lt;/span&gt; &lt;span class="rem"&gt;//c# quote character
-- really just a "&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 38: &lt;/span&gt; &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; qChr
= &lt;span class="str"&gt;"\""&lt;/span&gt;;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 39: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 40: &lt;/span&gt; &lt;span class="rem"&gt;//sb to work with&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 41: &lt;/span&gt; var sb = &lt;span class="kwrd"&gt;new&lt;/span&gt; StringBuilder(txt);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 42: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 43: &lt;/span&gt; &lt;span class="rem"&gt;//escape appropriately&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 44: &lt;/span&gt; &lt;span class="rem"&gt;//escape the quotes with ""&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 45: &lt;/span&gt; sb.Replace(qChr, qChr + qChr);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 46: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 47: &lt;/span&gt; &lt;span class="rem"&gt;//insert " at beginning
and end&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 48: &lt;/span&gt; sb.Insert(0, &lt;span class="str"&gt;"@"&lt;/span&gt; + qChr);&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 49: &lt;/span&gt; sb.Append(qChr);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 50: &lt;/span&gt; &lt;span class="kwrd"&gt;return&lt;/span&gt; sb.ToString();&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 51: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 52: &lt;/span&gt; &lt;span class="preproc"&gt;#endregion&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 53: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 54: &lt;/span&gt; &lt;span class="preproc"&gt;#region&lt;/span&gt; &lt;span class="str"&gt;"Commentize"&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 55: &lt;/span&gt; &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 56: &lt;/span&gt; &lt;span class="rem"&gt;/// Commentizes text passed
to it for use in C#&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 57: &lt;/span&gt; &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 58: &lt;/span&gt; &lt;span class="rem"&gt;/// &amp;lt;param name="txt"&amp;gt;Text
to be Stringinized&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 59: &lt;/span&gt; &lt;span class="rem"&gt;/// &amp;lt;returns&amp;gt;C#
Commentized text&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 60: &lt;/span&gt; &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; CommentizeInCs(&lt;span class="kwrd"&gt;string&lt;/span&gt; txt)&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 61: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 62: &lt;/span&gt; &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; cmtChar
= &lt;span class="str"&gt;"//"&lt;/span&gt;;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 63: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 64: &lt;/span&gt; var sb = &lt;span class="kwrd"&gt;new&lt;/span&gt; StringBuilder(txt.Length);&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 65: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 66: &lt;/span&gt; &lt;span class="rem"&gt;//process the passed string
(txt), one line at a time&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 67: &lt;/span&gt; &lt;span class="rem"&gt;//the original
was horrible WTF code&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 68: &lt;/span&gt; &lt;span class="kwrd"&gt;using&lt;/span&gt; (var reader = &lt;span class="kwrd"&gt;new&lt;/span&gt; StringReader(txt))&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 69: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 70: &lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; line;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 71: &lt;/span&gt; &lt;span class="kwrd"&gt;while&lt;/span&gt; ((line
= reader.ReadLine()) != &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 72: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 73: &lt;/span&gt; sb.AppendLine(cmtChar + line);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 74: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 75: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 76: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 77: &lt;/span&gt; &lt;span class="kwrd"&gt;return&lt;/span&gt; sb.ToString();&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 78: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 79: &lt;/span&gt; &lt;span class="preproc"&gt;#endregion&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 80: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 81: &lt;/span&gt; &lt;span class="preproc"&gt;#region&lt;/span&gt; &lt;span class="str"&gt;"Stringbuilderize"&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 82: &lt;/span&gt; &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; StringbuilderizeInCs(&lt;span class="kwrd"&gt;string&lt;/span&gt; txt, &lt;span class="kwrd"&gt;string&lt;/span&gt; sbName)&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 83: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 84: &lt;/span&gt; &lt;span class="rem"&gt;//c# quote character -- really
just a "&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 85: &lt;/span&gt; &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; qChr
= &lt;span class="str"&gt;"\""&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 86: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 87: &lt;/span&gt; &lt;span class="rem"&gt;//sb to work with&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 88: &lt;/span&gt; var sb = &lt;span class="kwrd"&gt;new&lt;/span&gt; StringBuilder(txt);&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 89: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 90: &lt;/span&gt; &lt;span class="rem"&gt;//escape \,", and {}&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 91: &lt;/span&gt; sb.Replace(qChr, qChr + qChr);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 92: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 93: &lt;/span&gt; &lt;span class="rem"&gt;//process the passed
string (txt), one line at a time&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 94: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 95: &lt;/span&gt; &lt;span class="rem"&gt;//dump the stringbuilder
into a temp string&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 96: &lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; fullString =
sb.ToString();&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 97: &lt;/span&gt; sb.Clear(); &lt;span class="rem"&gt;//lovely
.net 4 - sb.Remove(0, sb.Length);&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 98: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 99: &lt;/span&gt; &lt;span class="rem"&gt;//the original
was horrible WTF code&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 100: &lt;/span&gt; &lt;span class="kwrd"&gt;using&lt;/span&gt; (var reader
= &lt;span class="kwrd"&gt;new&lt;/span&gt; StringReader(fullString))&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 101: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 102: &lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; line;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 103: &lt;/span&gt; &lt;span class="kwrd"&gt;while&lt;/span&gt; ((line
= reader.ReadLine()) != &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 104: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 105: &lt;/span&gt; sb.Append(sbName + &lt;span class="str"&gt;".AppendLine("&lt;/span&gt;);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 106: &lt;/span&gt; sb.Append(&lt;span class="str"&gt;"@"&lt;/span&gt; + qChr);&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 107: &lt;/span&gt; sb.Append(line.Replace(&lt;span class="str"&gt;"\t"&lt;/span&gt;, &lt;span class="str"&gt;"\\t"&lt;/span&gt;));&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 108: &lt;/span&gt; sb.AppendLine(qChr + &lt;span class="str"&gt;");"&lt;/span&gt;);&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 109: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 110: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 111: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 112: &lt;/span&gt; &lt;span class="rem"&gt;//TODO: Better '@"" + ' replacement
to not cover inside strings&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 113: &lt;/span&gt; sb.Replace(&lt;span class="str"&gt;"@"&lt;/span&gt; +
qChr + qChr + &lt;span class="str"&gt;" + "&lt;/span&gt;, &lt;span class="str"&gt;""&lt;/span&gt;);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 114: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 115: &lt;/span&gt; &lt;span class="rem"&gt;//add the dec
statement&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 116: &lt;/span&gt; sb.Insert(0, &lt;span class="str"&gt;"StringBuilder
"&lt;/span&gt; + sbName + &lt;span class="str"&gt;" = new StringBuilder("&lt;/span&gt; + txt.Length
+ &lt;span class="str"&gt;");"&lt;/span&gt; + Environment.NewLine);&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 117: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 118: &lt;/span&gt; &lt;span class="rem"&gt;//and return&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 119: &lt;/span&gt; &lt;span class="kwrd"&gt;return&lt;/span&gt; sb.ToString();&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 120: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 121: &lt;/span&gt; &lt;span class="preproc"&gt;#endregion&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 122: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 123: &lt;/span&gt; &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 124: &lt;/span&gt; &lt;span class="rem"&gt;/// Inserts text at current
cursor location in the application&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 125: &lt;/span&gt; &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 126: &lt;/span&gt; &lt;span class="rem"&gt;/// &amp;lt;param name="application"&amp;gt;application
with activewindow&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 127: &lt;/span&gt; &lt;span class="rem"&gt;/// &amp;lt;param
name="text"&amp;gt;text to insert&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 128: &lt;/span&gt; &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Paste(DTE2
application, &lt;span class="kwrd"&gt;string&lt;/span&gt; text)&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 129: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 130: &lt;/span&gt; &lt;span class="rem"&gt;//get the text document&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 131: &lt;/span&gt; var txt = (TextDocument)application.ActiveDocument.Object(&lt;span class="str"&gt;"TextDocument"&lt;/span&gt;);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 132: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 133: &lt;/span&gt; &lt;span class="rem"&gt;//get an edit
point&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 134: &lt;/span&gt; EditPoint ep = txt.Selection.ActivePoint.CreateEditPoint();&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 135: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 136: &lt;/span&gt; &lt;span class="rem"&gt;//get a start point&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 137: &lt;/span&gt; EditPoint sp = txt.Selection.ActivePoint.CreateEditPoint();&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 138: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 139: &lt;/span&gt; &lt;span class="rem"&gt;//open the undo
context&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 140: &lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; isOpen = application.UndoContext.IsOpen;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 141: &lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (!isOpen)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 142: &lt;/span&gt; application.UndoContext.Open(&lt;span class="str"&gt;"SmartPaster"&lt;/span&gt;);&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 143: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 144: &lt;/span&gt; &lt;span class="rem"&gt;//clear the selection&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 145: &lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (!txt.Selection.IsEmpty)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 146: &lt;/span&gt; txt.Selection.Delete();&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 147: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 148: &lt;/span&gt; &lt;span class="rem"&gt;//insert the text&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 149: &lt;/span&gt; &lt;span class="rem"&gt;//ep.Insert(Indent(text,
ep.LineCharOffset))&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 150: &lt;/span&gt; ep.Insert(text);&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 151: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 152: &lt;/span&gt; &lt;span class="rem"&gt;//smart format&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 153: &lt;/span&gt; sp.SmartFormat(ep);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 154: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 155: &lt;/span&gt; &lt;span class="rem"&gt;//close the context&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 156: &lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (!isOpen)&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 157: &lt;/span&gt; application.UndoContext.Close();&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 158: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 159: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 160: &lt;/span&gt; &lt;span class="preproc"&gt;#region&lt;/span&gt; &lt;span class="str"&gt;"Paste
As ..."&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 161: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 162: &lt;/span&gt; &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 163: &lt;/span&gt; &lt;span class="rem"&gt;/// Public method
to paste and format clipboard text as string the cursor &lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 164: &lt;/span&gt; &lt;span class="rem"&gt;/// location for the configured
or active window's langage .&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 165: &lt;/span&gt; &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 166: &lt;/span&gt; &lt;span class="rem"&gt;/// &amp;lt;param name="application"&amp;gt;application
to insert&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 167: &lt;/span&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; PasteAsString(DTE2
application)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 168: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 169: &lt;/span&gt; Paste(application, StringinizeInCs(ClipboardText));&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 170: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 171: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 172: &lt;/span&gt; &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 173: &lt;/span&gt; &lt;span class="rem"&gt;/// Public method
to paste and format clipboard text as comment the cursor &lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 174: &lt;/span&gt; &lt;span class="rem"&gt;/// location for the configured
or active window's langage .&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 175: &lt;/span&gt; &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 176: &lt;/span&gt; &lt;span class="rem"&gt;/// &amp;lt;param name="application"&amp;gt;application
to insert&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 177: &lt;/span&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; PasteAsComment(DTE2
application)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 178: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 179: &lt;/span&gt; Paste(application, CommentizeInCs(ClipboardText));&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 180: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 181: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 182: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 183: &lt;/span&gt; &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 184: &lt;/span&gt; &lt;span class="rem"&gt;/// Public method to paste
format clipboard text into a specified region&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 185: &lt;/span&gt; &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 186: &lt;/span&gt; &lt;span class="rem"&gt;/// &amp;lt;param name="application"&amp;gt;application
to insert&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 187: &lt;/span&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; PasteAsRegion(DTE2
application)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 188: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 189: &lt;/span&gt; &lt;span class="rem"&gt;//get the region
name&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 190: &lt;/span&gt; &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; region
= &lt;span class="str"&gt;"myRegion"&lt;/span&gt;;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 191: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 192: &lt;/span&gt; &lt;span class="rem"&gt;//it's so simple, we really
don't need a function&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 193: &lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; csRegionized
= &lt;span class="str"&gt;"#region "&lt;/span&gt; + region + Environment.NewLine + ClipboardText
+ Environment.NewLine + &lt;span class="str"&gt;"#endregion"&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 194: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 195: &lt;/span&gt; &lt;span class="rem"&gt;//and paste&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 196: &lt;/span&gt; Paste(application, csRegionized);&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 197: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 198: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 199: &lt;/span&gt; &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 200: &lt;/span&gt; &lt;span class="rem"&gt;/// Public method to paste
and format clipboard text as stringbuilder the cursor &lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 201: &lt;/span&gt; &lt;span class="rem"&gt;/// location for
the configured or active window's langage .&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 202: &lt;/span&gt; &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 203: &lt;/span&gt; &lt;span class="rem"&gt;/// &amp;lt;param
name="application"&amp;gt;application to insert&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 204: &lt;/span&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; PasteAsStringBuilder(DTE2
application)&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 205: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 206: &lt;/span&gt; &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; stringbuilder
= &lt;span class="str"&gt;"sb"&lt;/span&gt;;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 207: &lt;/span&gt; Paste(application, StringbuilderizeInCs(ClipboardText,
stringbuilder));&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 208: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 209: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 210: &lt;/span&gt; &lt;span class="preproc"&gt;#endregion&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 211: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 212: &lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;
&lt;img width="0" height="0" src="http://martinwilley.com/blog/aggbug.ashx?id=3c13f5c7-17e1-42e1-be64-3e4bea605a5a" /&gt;</description>
      <comments>http://martinwilley.com/blog/CommentView,guid,3c13f5c7-17e1-42e1-be64-3e4bea605a5a.aspx</comments>
      <category>.net 4</category>
      <category>Coderush</category>
      <category>VS2010</category>
    </item>
    <item>
      <trackback:ping>http://martinwilley.com/blog/Trackback.aspx?guid=8ec6fb55-d528-4fb8-9efb-c434877a2044</trackback:ping>
      <pingback:server>http://martinwilley.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://martinwilley.com/blog/PermaLink,guid,8ec6fb55-d528-4fb8-9efb-c434877a2044.aspx</pingback:target>
      <dc:creator>Martin</dc:creator>
      <georss:point>0 0</georss:point>
      <wfw:comment>http://martinwilley.com/blog/CommentView,guid,8ec6fb55-d528-4fb8-9efb-c434877a2044.aspx</wfw:comment>
      <wfw:commentRss>http://martinwilley.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=8ec6fb55-d528-4fb8-9efb-c434877a2044</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">"<b>Covariance</b>" = specified or MORE
derived type<br /><br />
So upcasting to a more basic class in polymorphism is covariant.          <span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px;"><span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"><br />
object</span> s <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">=</span><span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">new</span><span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">string</span>('a',
3);</span><br /><br />
But you couldn't do it for IEnumerables, even though it seemed safe. Well, now in
.net 4 you can.<span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px;"><br /><br />
IList&lt;<span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">string</span>&gt;
stringList <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">=</span><span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">new</span> List&lt;<span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">string</span>&gt;(); <span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px;">//will
not compile in .net 1-3, but does in net 4</span> IEnumerable&lt;<span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">object</span>&gt;
objectList <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">=</span> stringList;</span>Trivia:
since .net 1, arrays were covariant.<br /><pre><span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px;"><span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">object</span>[]
data <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">=</span><span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">new</span><span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">string</span>[3];<br />
data[0] <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">=</span><span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;">"s"</span>;<br /><span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px;"></span></span><span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px;">data[0] <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">=</span></span><span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px;"><span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px;">1</span></span><span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px;">;</span><span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px;"><span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px;"> //no
compiler error- just a runtime ArrayTypeMismatchException</span></span></pre>Now IEnumerable&lt;T&gt;
and IQueryable&lt;T&gt; are covariant.<br /><br /><pre><span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px;"><span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px;"><pre><span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px;">IList&lt;Cat&gt;
cats <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">=</span><span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">new</span> List&lt;Cat&gt;();<br /><span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px;">//you
can cast to IEnumerable (or IQueryable)</span><br />
IEnumerable&lt;Animal&gt; pets <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">=</span> cats;<br /><span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px;">//but
you cannot cast to the read-write classes</span><br /><span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px;">//IList&lt;Animal&gt;
animals = cats; //compiler error</span></span></pre></span></span></pre>Covariant
interfaces must be read-only (and not value types).<br /><br /><b>Contravariance </b>= specified or LESS derived type 
<br />
 <br /><pre><span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px;">var
cats <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">=</span><span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">new</span> List&lt;Cat&gt;(); <span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px;">//predicate
is contravariant</span> cats.Find(HasFur); <span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px;">//private
static bool HasFur(Animal animal)</span><span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px;">//so
is IComparable</span> cats.Sort(SortByName); <span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px;">//private
static int SortByName(Animal x, Animal y)</span></span></pre><br /><p></p><img width="0" height="0" src="http://martinwilley.com/blog/aggbug.ashx?id=8ec6fb55-d528-4fb8-9efb-c434877a2044" /></body>
      <title>covariance and contravariance in .net 4 in 2 minutes</title>
      <guid isPermaLink="false">http://martinwilley.com/blog/PermaLink,guid,8ec6fb55-d528-4fb8-9efb-c434877a2044.aspx</guid>
      <link>http://martinwilley.com/blog/2010/04/02/covarianceAndContravarianceInNet4In2Minutes.aspx</link>
      <pubDate>Fri, 02 Apr 2010 09:10:48 GMT</pubDate>
      <description>"&lt;b&gt;Covariance&lt;/b&gt;" = specified or MORE derived type&lt;br&gt;
&lt;br&gt;
So upcasting to a more basic class in polymorphism is covariant.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;
&lt;br&gt;
object&lt;/span&gt; s &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;new&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;string&lt;/span&gt;('a',
3);&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;
But you couldn't do it for IEnumerables, even though it seemed safe. Well, now in
.net 4 you can.&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;
&lt;br&gt;
&lt;br&gt;
IList&amp;lt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;string&lt;/span&gt;&amp;gt;
stringList &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;new&lt;/span&gt; List&amp;lt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;string&lt;/span&gt;&amp;gt;(); &lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;//will
not compile in .net 1-3, but does in net 4&lt;/span&gt; IEnumerable&amp;lt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;object&lt;/span&gt;&amp;gt;
objectList &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; stringList;&lt;/span&gt;Trivia:
since .net 1, arrays were covariant.&lt;br&gt;
&lt;pre&gt;&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;object&lt;/span&gt;[]
data &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;new&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;string&lt;/span&gt;[3];&lt;br&gt;
data[0] &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; &lt;span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;"&gt;"s"&lt;/span&gt;;&lt;br&gt;
&lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;data[0] &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; &lt;/span&gt;&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;&lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;;&lt;/span&gt;&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;&lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt; //no
compiler error- just a runtime ArrayTypeMismatchException&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;Now IEnumerable&amp;lt;T&amp;gt;
and IQueryable&amp;lt;T&amp;gt; are covariant.&lt;br&gt;
&lt;br&gt;
&lt;pre&gt;&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;&lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;&lt;pre&gt;&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;IList&amp;lt;Cat&amp;gt;
cats &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;new&lt;/span&gt; List&amp;lt;Cat&amp;gt;();&lt;br&gt;
&lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;//you
can cast to IEnumerable (or IQueryable)&lt;/span&gt;
&lt;br&gt;
IEnumerable&amp;lt;Animal&amp;gt; pets &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; cats;&lt;br&gt;
&lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;//but
you cannot cast to the read-write classes&lt;/span&gt;
&lt;br&gt;
&lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;//IList&amp;lt;Animal&amp;gt;
animals = cats; //compiler error&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;Covariant
interfaces must be read-only (and not value types).&lt;br&gt;
&lt;br&gt;
&lt;b&gt;Contravariance &lt;/b&gt;= specified or LESS derived type 
&lt;br&gt;
&amp;nbsp;&lt;br&gt;
&lt;pre&gt;&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;var
cats &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;new&lt;/span&gt; List&amp;lt;Cat&amp;gt;(); &lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;//predicate
is contravariant&lt;/span&gt; cats.Find(HasFur); &lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;//private
static bool HasFur(Animal animal)&lt;/span&gt; &lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;//so
is IComparable&lt;/span&gt; cats.Sort(SortByName); &lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px;"&gt;//private
static int SortByName(Animal x, Animal y)&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;br&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://martinwilley.com/blog/aggbug.ashx?id=8ec6fb55-d528-4fb8-9efb-c434877a2044" /&gt;</description>
      <comments>http://martinwilley.com/blog/CommentView,guid,8ec6fb55-d528-4fb8-9efb-c434877a2044.aspx</comments>
      <category>.net 4</category>
    </item>
  </channel>
</rss>