<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.microsoft.co.il/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Arik Poznanski&amp;#39;s Blog : Visual Studio</title><link>http://blogs.microsoft.co.il/blogs/arik/archive/tags/Visual+Studio/default.aspx</link><description>Tags: Visual Studio</description><dc:language>en</dc:language><generator>CommunityServer 2007.1 (Build: 20917.1142)</generator><item><title>How To Use a .NET 4 Based DLL From .NET 2 Based Application?</title><link>http://blogs.microsoft.co.il/blogs/arik/archive/2011/05/30/how-to-use-a-net-4-based-dll-from-net-2-based-application.aspx</link><pubDate>Mon, 30 May 2011 23:50:01 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:838795</guid><dc:creator>arik</dc:creator><slash:comments>23</slash:comments><description>&lt;h3&gt;Introduction&lt;/h3&gt;  &lt;p&gt;The official answer is you can’t. Even with the &lt;a href="http://msdn.microsoft.com/en-us/library/ee518876.aspx"&gt;In-Process Side by Side execution&lt;/a&gt; (SxS) feature, introduced in .NET 4.&lt;/p&gt;  &lt;p&gt;The SxS feature was intended to be used when &lt;a href="http://en.wikipedia.org/wiki/Component_Object_Model"&gt;COM&lt;/a&gt; is involved. For example, if you got an application that loads plugins, like outlook, and it loads 2 COM plugins, one is using .NET 4 and the other is using .NET 2.0 then it will load two versions of the CLR into the process using the new SxS feature.&lt;/p&gt;  &lt;p&gt;What if I simply have a .NET 2 application or DLL that needs to access a .NET 4 DLL?&lt;/p&gt;  &lt;p&gt;Personally I’ve encountered two scenarios when I had to solve this problem:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;I had a 3rd-party control that would load only in a .NET 3.5 application, but I had to use it in a .NET 4 application. &lt;/li&gt;    &lt;li&gt;I wanted to write a plug-in for Windows Live Writer, which must use .NET 2.0, but I needed to use in my plug-in a .NET 4 DLL. &lt;/li&gt; &lt;/ol&gt;  &lt;h3&gt;So, what can we do if no COM is involved?&lt;/h3&gt;  &lt;p&gt;Well, simply add &lt;strong&gt;COM&lt;/strong&gt; to the mixture..&lt;/p&gt;  &lt;p&gt;The idea is that you can expose the required classes from your DLL (which uses .NET Framework X) as COM classes (using &lt;a href="http://msdn.microsoft.com/en-us/library/aa645736(v=vs.71).aspx"&gt;COM Interop&lt;/a&gt;), and then use those classes from your other DLL (which uses .NET Framework Y). Since you are crossing a COM interface, in-process SxS will kick in and work its magic.&lt;/p&gt;  &lt;p&gt;&lt;font style="background-color:#ffff00;"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;h3&gt;Steps to work around the problem&lt;/h3&gt;  &lt;h4&gt;Create a .NET 4 DLL&lt;/h4&gt;  &lt;p&gt;Suppose we have a .NET 4 DLL which does some .NET 4 functionality. In the attached example our .NET 4 class prints the CLR version, which should be 4. This DLL is compiled with .NET Framework 4.&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:0b45f197-9090-44a4-b6ee-ecafda3ffe93" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background-color:#ffffff;overflow:auto;padding:2px 5px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System;&lt;br /&gt; &lt;br /&gt; &lt;span style="color:#0000ff;"&gt;namespace&lt;/span&gt; Net4Assembly&lt;br /&gt; {&lt;br /&gt;     &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;MyClass&lt;/span&gt;&lt;br /&gt;     {&lt;br /&gt;         &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; DoNet4Action()&lt;br /&gt;         {&lt;br /&gt;             &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color:#a31515;"&gt;&amp;quot;CLR version from DLL: {0}&amp;quot;&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;Environment&lt;/span&gt;.Version);&lt;br /&gt;         }&lt;br /&gt;     }&lt;br /&gt; }&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h4&gt;Create a .NET 2 EXE&lt;/h4&gt;  &lt;p&gt;Here we create a .NET 2 EXE which will eventually call the .NET 4 DLL, currently all it does is write it’s own CLR version.&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:ab6cdda1-f32a-407c-83d3-d60f7d30ecb1" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background-color:#ffffff;max-height:500px;overflow:auto;padding:2px 5px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System;&lt;br /&gt; &lt;br /&gt; &lt;span style="color:#0000ff;"&gt;namespace&lt;/span&gt; Net2Assembly&lt;br /&gt; {&lt;br /&gt;     &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Program&lt;/span&gt;&lt;br /&gt;     {&lt;br /&gt;         &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Main(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;[] args)&lt;br /&gt;         {&lt;br /&gt;             &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color:#a31515;"&gt;&amp;quot;CLR version from EXE: {0}&amp;quot;&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;Environment&lt;/span&gt;.Version);&lt;br /&gt;         }&lt;br /&gt;     }&lt;br /&gt; }&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h4&gt;Create a .NET 4 to .NET 2 adapter&lt;/h4&gt;  &lt;p&gt;Here we create a .NET 4 DLL that exposes the same functionality we need from our original .NET 4 DLL only it exposes it in a COM-friendly way. In this example, it only needs to delegate the call to the original implementation, but in more advanced scenarios it should translate the parameters to something more COM friendly. In addition to changing the parameters the classes also implement interfaces (as required by COM) and are marked with &lt;strong&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.comvisibleattribute.aspx"&gt;ComVisible&lt;/a&gt; &lt;/strong&gt;and &lt;strong&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.guidattribute.aspx"&gt;Guid&lt;/a&gt; &lt;/strong&gt;attributes to allow access using COM.&lt;/p&gt;  &lt;p&gt;Here is our COM visible interface:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:6028544e-e566-4257-a2dc-d4923faf5709" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background-color:#ffffff;overflow:auto;padding:2px 5px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System;&lt;br /&gt; &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.Runtime.InteropServices;&lt;br /&gt; &lt;br /&gt; &lt;span style="color:#0000ff;"&gt;namespace&lt;/span&gt; Net4ToNet2Adapter&lt;br /&gt; {&lt;br /&gt;     [&lt;span style="color:#2b91af;"&gt;ComVisible&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;)]&lt;br /&gt;     [&lt;span style="color:#2b91af;"&gt;Guid&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;E36BBF07-591E-4959-97AE-D439CBA392FB&amp;quot;&lt;/span&gt;)]&lt;br /&gt;     &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;interface&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;IMyClassAdapter&lt;/span&gt;&lt;br /&gt;     {&lt;br /&gt;         &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; DoNet4Action();&lt;br /&gt;     }&lt;br /&gt; }&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;And our COM visible class, which delegates its calls to the original class.&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:a9a5f024-78a7-4614-a696-4b995d1dab20" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background-color:#ffffff;overflow:auto;padding:2px 5px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System;&lt;br /&gt; &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.Runtime.InteropServices;&lt;br /&gt; &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; Net4Assembly;&lt;br /&gt; &lt;br /&gt; &lt;span style="color:#0000ff;"&gt;namespace&lt;/span&gt; Net4ToNet2Adapter&lt;br /&gt; {&lt;br /&gt;     [&lt;span style="color:#2b91af;"&gt;ComVisible&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;)]&lt;br /&gt;     [&lt;span style="color:#2b91af;"&gt;Guid&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;A6574755-925A-4E41-A01B-B6A0EEF72DF0&amp;quot;&lt;/span&gt;)]&lt;br /&gt;     &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;MyClassAdapter&lt;/span&gt; : &lt;span style="color:#2b91af;"&gt;IMyClassAdapter&lt;/span&gt;&lt;br /&gt;     {&lt;br /&gt;         &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;MyClass&lt;/span&gt; _myClass = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;MyClass&lt;/span&gt;();&lt;br /&gt; &lt;br /&gt;         &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; DoNet4Action()&lt;br /&gt;         {&lt;br /&gt;             _myClass.DoNet4Action();&lt;br /&gt;         }&lt;br /&gt;     }&lt;br /&gt; }&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;u&gt;Note&lt;/u&gt;: we could have combined &lt;strong&gt;Net4Assembly.MyClass &lt;/strong&gt;and &lt;strong&gt;Net4ToNet2Adapter.MyClassAdapter&lt;/strong&gt; into the same class but I wanted to keep the example general. In real life application you often can’t change the original object and thus you are forced to create a wrapper.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h4&gt;Add support to the adapter for registration-free COM activation&lt;/h4&gt;  &lt;p&gt;&lt;u&gt;Important note&lt;/u&gt;: this part is not really necessary for the .NET 4 to .NET 2 interop to work. But without it you will need to start using he registry for registering your .NET COM components and most projects would rather to avoid it if possible. If this is not a problem just register your objects in the registry and move to the next step.&lt;/p&gt;  &lt;p&gt;To add support for registration-free COM we need to create two application manifest files.&lt;/p&gt;  &lt;p&gt;The first application manifest specifies dependent assemblies for the client executable. Note that since this manifest replaces the default .NET manifest I’ve added some extra standard manifest stuff (trustinfo), but only the first part is really needed for the registration-free COM to work. To add it, add a file to the client project named &lt;strong&gt;app.manifest &lt;/strong&gt;(“Add new item” –&amp;gt; “Application Manifest”) and change the project properties to use this file. &lt;/p&gt;  &lt;p&gt;Following is the content of &lt;strong&gt;app.manifest&lt;/strong&gt; for the &lt;strong&gt;Net2Aseembly.exe&lt;/strong&gt; client in our example:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:fd25b59c-b95d-4edf-83d6-4189e5d4c4d3" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background-color:#ffffff;overflow:auto;padding:2px 5px;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color:#a31515;"&gt;xml&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;version&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;1.0&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;encoding&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;UTF-8&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;standalone&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;yes&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;?&amp;gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;assembly&lt;/span&gt;&lt;br /&gt;   &lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;xmlns&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;urn:schemas-microsoft-com:asm.v1&lt;/span&gt;&amp;quot;&lt;br /&gt;   &lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;manifestVersion&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;1.0&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;   &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;assemblyIdentity&lt;/span&gt;&lt;br /&gt;     &lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; = &lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;win32&lt;/span&gt;&amp;quot;&lt;br /&gt;     &lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; = &lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;Net2Assembly&lt;/span&gt;&amp;quot;&lt;br /&gt;     &lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;version&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; = &lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;1.0.0.0&lt;/span&gt;&amp;quot;&lt;br /&gt;     &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;   &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;dependency&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;dependentAssembly&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;       &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;assemblyIdentity&lt;/span&gt;&lt;br /&gt;         &lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;win32&lt;/span&gt;&amp;quot;&lt;br /&gt;         &lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;Net4ToNet2Adapter&lt;/span&gt;&amp;quot;&lt;br /&gt;         &lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;version&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;1.0.0.0&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt; /&amp;gt;&lt;/span&gt;&lt;br /&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;dependentAssembly&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;   &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;dependency&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;   &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;trustInfo&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;xmlns&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;urn:schemas-microsoft-com:asm.v2&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;security&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;       &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;requestedPrivileges&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;xmlns&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;urn:schemas-microsoft-com:asm.v3&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;         &lt;span style="color:#0000ff;"&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="color:#008000;"&gt; UAC Manifest Options&lt;/span&gt;&lt;br /&gt;             &lt;span style="color:#008000;"&gt;If you want to change the Windows User Account Control level replace the &lt;/span&gt;&lt;br /&gt;             &lt;span style="color:#008000;"&gt;requestedExecutionLevel node with one of the following.&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;         &lt;span style="color:#008000;"&gt;&amp;lt;requestedExecutionLevel  level=&amp;quot;asInvoker&amp;quot; uiAccess=&amp;quot;false&amp;quot; /&amp;gt;&lt;/span&gt;&lt;br /&gt;         &lt;span style="color:#008000;"&gt;&amp;lt;requestedExecutionLevel  level=&amp;quot;requireAdministrator&amp;quot; uiAccess=&amp;quot;false&amp;quot; /&amp;gt;&lt;/span&gt;&lt;br /&gt;         &lt;span style="color:#008000;"&gt;&amp;lt;requestedExecutionLevel  level=&amp;quot;highestAvailable&amp;quot; uiAccess=&amp;quot;false&amp;quot; /&amp;gt;&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;             &lt;span style="color:#008000;"&gt;If you want to utilize File and Registry Virtualization for backward &lt;/span&gt;&lt;br /&gt;             &lt;span style="color:#008000;"&gt;compatibility then delete the requestedExecutionLevel node.&lt;/span&gt;&lt;br /&gt;         &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;--&amp;gt;&lt;/span&gt;&lt;br /&gt;         &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;requestedExecutionLevel&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;level&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;asInvoker&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;uiAccess&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt; /&amp;gt;&lt;/span&gt;&lt;br /&gt;       &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;requestedPrivileges&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;security&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;   &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;trustInfo&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;assembly&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;The second application manifest, describes the COM components which are exposed in the assembly. It needs to be set as the application manifest which resides as a native Win32 resource inside the DLL.&amp;#160; &lt;/p&gt;  &lt;p&gt;Unfortunately, this can’t be done as easily as the previous manifest. In &lt;strong&gt;Visual Studio 2010&lt;/strong&gt;, the relevant field in the project properties is disabled when the project is of type &lt;strong&gt;Class Library&lt;/strong&gt;. So we must go to the &lt;strong&gt;Net4ToNet2Adapter.csproj &lt;/strong&gt;file and change it ourselves. The change is easy, just add the following lines in the relevant place:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:596c139f-afc7-4ed5-ab42-93b8fac80331" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background-color:#ffffff;overflow:auto;padding:2px 5px;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;PropertyGroup&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;   &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ApplicationManifest&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;app.manifest&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ApplicationManifest&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;PropertyGroup&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Following is the content of &lt;strong&gt;app.manifest&lt;/strong&gt; for the &lt;strong&gt;Net4ToNet2Adapter.dll&lt;/strong&gt; in our example:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:da581a66-7533-494e-9bea-4a66d521b9e4" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background-color:#ffffff;overflow:auto;padding:2px 5px;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color:#a31515;"&gt;xml&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;version&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;1.0&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;encoding&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;UTF-8&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;standalone&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;yes&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;?&amp;gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;assembly&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;xmlns&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;urn:schemas-microsoft-com:asm.v1&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;manifestVersion&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;1.0&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;   &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;assemblyIdentity&lt;/span&gt;&lt;br /&gt;     &lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;win32&lt;/span&gt;&amp;quot;&lt;br /&gt;     &lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;Net4ToNet2Adapter&lt;/span&gt;&amp;quot;&lt;br /&gt;     &lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;version&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;1.0.0.0&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt; /&amp;gt;&lt;/span&gt;&lt;br /&gt;   &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;clrClass&lt;/span&gt;&lt;br /&gt;     &lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;clsid&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&amp;quot;{&lt;span style="color:#0000ff;"&gt;A6574755-925A-4E41-A01B-B6A0EEF72DF0}&lt;/span&gt;&amp;quot;&lt;br /&gt;     &lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;progid&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;Net4ToNet2Adapter.MyClassAdapter&lt;/span&gt;&amp;quot;&lt;br /&gt;     &lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;threadingModel&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;Both&lt;/span&gt;&amp;quot;&lt;br /&gt;     &lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;Net4ToNet2Adapter.MyClassAdapter&lt;/span&gt;&amp;quot;&lt;br /&gt;     &lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;runtimeVersion&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;v4.0.30319&lt;/span&gt;&amp;quot;&lt;br /&gt;     &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;assembly&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h4&gt;Use our .NET 4 DLL via COM&lt;/h4&gt;  &lt;p&gt;Now all you need to do is create an instance of your .NET 4 class from your .NET 2 executable using COM:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:0851afe8-181d-4621-9f6a-127c2683bcb5" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background-color:#ffffff;overflow:auto;padding:2px 5px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System;&lt;br /&gt; &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; Net4ToNet2Adapter;&lt;br /&gt; &lt;br /&gt; &lt;span style="color:#0000ff;"&gt;namespace&lt;/span&gt; Net2Assembly&lt;br /&gt; {&lt;br /&gt;     &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Program&lt;/span&gt;&lt;br /&gt;     {&lt;br /&gt;         &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Main(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;[] args)&lt;br /&gt;         {&lt;br /&gt;             &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color:#a31515;"&gt;&amp;quot;CLR version from EXE: {0}&amp;quot;&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;Environment&lt;/span&gt;.Version);&lt;br /&gt;             &lt;br /&gt;             &lt;span style="color:#2b91af;"&gt;Type&lt;/span&gt; myClassAdapterType = &lt;span style="color:#2b91af;"&gt;Type&lt;/span&gt;.GetTypeFromProgID(&lt;span style="color:#a31515;"&gt;&amp;quot;Net4ToNet2Adapter.MyClassAdapter&amp;quot;&lt;/span&gt;);&lt;br /&gt;             &lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; myClassAdapterInstance = &lt;span style="color:#2b91af;"&gt;Activator&lt;/span&gt;.CreateInstance(myClassAdapterType);&lt;br /&gt;             &lt;span style="color:#2b91af;"&gt;IMyClassAdapter&lt;/span&gt; myClassAdapter = (&lt;span style="color:#2b91af;"&gt;IMyClassAdapter&lt;/span&gt;)myClassAdapterInstance;&lt;br /&gt;             myClassAdapter.DoNet4Action();&lt;br /&gt;         }&lt;br /&gt;     }&lt;br /&gt; }&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;u&gt;Note&lt;/u&gt;: Since the interface &lt;strong&gt;IMyClassAdapter&lt;/strong&gt; should be duplicated in the client, I’ve added the source file &lt;strong&gt;IMyClassAdapter.cs &lt;/strong&gt;as a link to the client project.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h4&gt;The result&lt;/h4&gt;  &lt;p&gt;The result of running this simple console application is:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/arik/image_19C9C67B.png"&gt;&lt;img style="margin:0px auto;display:block;float:none;" title="image" alt="image" src="http://blogs.microsoft.co.il/blogs/arik/image_thumb_22F5DBEF.png" width="843" height="549" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;I think the image speaks for itself.&lt;/p&gt;  &lt;p&gt;&lt;font style="background-color:#ffff00;"&gt;&lt;/font&gt;I’ve uploaded the full source of this example to &lt;a href="http://code.msdn.microsoft.com/Using-a-NET-4-Based-DLL-bb141db3"&gt;MSDN Code Gallery&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;That’s it for now,    &lt;br /&gt;Arik Poznanski.&lt;/p&gt;&lt;div class="wlWriterHeaderFooter" style="margin:0px;padding:0px 0px 0px 0px;"&gt;&lt;a href="http://www.dotnetkicks.com/kick/?url=http://blogs.microsoft.co.il/blogs/arik/archive/2011/05/30/how-to-use-a-net-4-based-dll-from-net-2-based-application.aspx"&gt;&lt;img border="0" alt="kick it on DotNetKicks.com" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://blogs.microsoft.co.il/blogs/arik/archive/2011/05/30/how-to-use-a-net-4-based-dll-from-net-2-based-application.aspx&amp;amp;bgcolor=6600FF" /&gt;&lt;/a&gt; &lt;a href="http://dotnetshoutout.com/Submit?url=http://blogs.microsoft.co.il/blogs/arik/archive/2011/05/30/how-to-use-a-net-4-based-dll-from-net-2-based-application.aspx"&gt;&lt;img alt="Shout it" src="http://dotnetshoutout.com/image.axd?url=http://blogs.microsoft.co.il/blogs/arik/archive/2011/05/30/how-to-use-a-net-4-based-dll-from-net-2-based-application.aspx" style="border:0px;" /&gt;&lt;/a&gt; &lt;a href="http://www.codeproject.com/script/Articles/BlogFeedList.aspx?amid=172641" rel="tag" style="display:none;"&gt;CodeProject&lt;/a&gt; &lt;/div&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=838795" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/arik/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/arik/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://blogs.microsoft.co.il/blogs/arik/archive/tags/COM/default.aspx">COM</category><category domain="http://blogs.microsoft.co.il/blogs/arik/archive/tags/Interop/default.aspx">Interop</category><category domain="http://blogs.microsoft.co.il/blogs/arik/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blogs.microsoft.co.il/blogs/arik/archive/tags/DLL/default.aspx">DLL</category><category domain="http://blogs.microsoft.co.il/blogs/arik/archive/tags/.NET+4/default.aspx">.NET 4</category><category domain="http://blogs.microsoft.co.il/blogs/arik/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://blogs.microsoft.co.il/blogs/arik/archive/tags/CLR/default.aspx">CLR</category></item><item><title>Speed up Visual Studio Builds</title><link>http://blogs.microsoft.co.il/blogs/arik/archive/2011/05/17/speed-up-visual-studio-builds.aspx</link><pubDate>Tue, 17 May 2011 05:45:00 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:835767</guid><dc:creator>arik</dc:creator><slash:comments>21</slash:comments><description>&lt;p&gt;Recently I got involved in a big project where we had a single solution with approximately 100 projects.&lt;/p&gt;
&lt;h3&gt;Why 100 Projects in a Solution?&lt;/h3&gt;
&lt;p&gt;The reason for a 100 projects solution is that like in many &lt;u&gt;modular&lt;/u&gt; systems these days, we have the following three tiers:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;A few core / common projects every project will use. &lt;/li&gt;
&lt;li&gt;A large amount of modules, independent of each other. This tier directly depends on tier 1. &lt;/li&gt;
&lt;li&gt;A few end-projects which loads the different modules. This tier indirectly depends on tier 2. &lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/arik/image_268376F6.png"&gt;&lt;img style="MARGIN:0px auto;DISPLAY:block;FLOAT:none;" title="image" alt="image" src="http://blogs.microsoft.co.il/blogs/arik/image_thumb_53D4E6F9.png" width="595" height="480" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;So, yes, we could create several solutions with each tier compiling only when needed and using DLL reference instead of project references, but the amount of changes in all the tiers was still large enough and I’ve already seen this kind of build process fail miserably. So this was no go.&lt;/p&gt;
&lt;p&gt;Build time took 15 minutes for the whole solution. Since we enforced a gated check-in policy in the company, this was really a pain point for the developers.&lt;/p&gt;
&lt;p&gt;Note that the developers’ computers were strong enough, with 8GB ram, Intel Core i7 CPU and SSD disks.&lt;/p&gt;
&lt;p&gt;So I’ve started investigating what can be done to improve the situation.&lt;/p&gt;
&lt;h3&gt;Step 1: Build Projects in Parallel&lt;/h3&gt;
&lt;p&gt;Although the PC has 8 logical cores, the build system in Visual Studio 2010, when using C#, still uses only a single core! (Note this is not the case in C++ build system).&lt;/p&gt;
&lt;p&gt;So after browsing the web, I’ve found how you can manually trigger &lt;a href="http://msdn.microsoft.com/en-us/library/dd393574.aspx"&gt;&lt;b&gt;msbuild&lt;/b&gt;&lt;/a&gt; yourself as a Visual Studio external tool to compile your solution in parallel. &lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/arik/image_51D77223.png"&gt;&lt;img style="MARGIN:0px auto;DISPLAY:block;FLOAT:none;" title="image" alt="image" src="http://blogs.microsoft.co.il/blogs/arik/image_thumb_078CB77E.png" width="461" height="448" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;More details on how to set this up can be found in the following post by Scott Hanselman: &lt;a href="http://www.hanselman.com/blog/HackParallelMSBuildsFromWithinTheVisualStudioIDE.aspx"&gt;http://www.hanselman.com/blog/HackParallelMSBuildsFromWithinTheVisualStudioIDE.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;After setting this up I’ve got an approximate build time of 10.2 minutes. Not bad for a few minutes of work! Also, got the following beautiful image out of my CPUs, where you can really see them at work:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/arik/image_0C22C238.png"&gt;&lt;img style="MARGIN:0px auto;DISPLAY:block;FLOAT:none;" title="image" alt="image" src="http://blogs.microsoft.co.il/blogs/arik/image_thumb_21BCFAD5.png" width="412" height="459" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Step 2: Beware of Copy Local = True&lt;/h3&gt;
&lt;p&gt;In our 100-projects solution lots of projects reference each other, obviously. In addition to these references we also reference several 3&lt;sup&gt;rd&lt;/sup&gt; party components, practically from each module.&lt;/p&gt;
&lt;p&gt;All the above caused that whenever we would compile the solution, &lt;b&gt;over&lt;/b&gt; &lt;b&gt;4.5 GB&lt;/b&gt; of files were &lt;b&gt;&lt;u&gt;written.&lt;/u&gt;&lt;/b&gt; The majority (95%) of the writes were DLLs which were copied to the output folder of each project.&lt;/p&gt;
&lt;p&gt;To check out how many writes are done in your compilation check out &lt;b&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/arik/archive/2011/05/10/how-to-check-how-many-writes-are-done-while-you-build.aspx"&gt;this&lt;/a&gt;&lt;/b&gt; post.&lt;/p&gt;
&lt;p&gt;Anyway, 4.5 GB takes a long time to write, even on an SSD drive.&lt;/p&gt;
&lt;p&gt;So the next step was to eliminate those writes. To do this, we changed almost all of the “&lt;b&gt;Copy local&lt;/b&gt;” settings in all the referenced DLLs from the default &lt;b&gt;True&lt;/b&gt; to &lt;b&gt;False&lt;/b&gt;. This will prevent the referenced DLLs to be copied to the output folder of each project.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/arik/image_1E5B632D.png"&gt;&lt;img style="MARGIN:0px auto;DISPLAY:block;FLOAT:none;" title="image" alt="image" src="http://blogs.microsoft.co.il/blogs/arik/image_thumb_7B4AF1BC.png" width="387" height="647" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Note: some file names were blacked to protect the client’s properties.&lt;/p&gt;
&lt;p&gt;In addition we also changed the output folder of all the projects to a single folder, so all generated DLLs are copied to the one and only place where we actually run them. Doing so dropped the writes while compiling to under 200 MB, a huge time saver. Specifically, build time dropped to 7.5 minutes!&lt;/p&gt;
&lt;h3&gt;Step 3: Use RAM Disk&lt;/h3&gt;
&lt;p&gt;A RAM disk is a logical disk which resides entirely on the RAM. &lt;br /&gt;It is extremely fast (faster than any SSD), but it is erased on every power-down, so only use it for temporary files.&lt;/p&gt;
&lt;p&gt;Of course, you should have enough RAM to spare for this disk (the memory is pre-allocated for the disk use only), but on an 8GB PC, it’s usually not an issue.&lt;/p&gt;
&lt;p&gt;There are several programs you can use to set up a RAM disk. I used &lt;a href="http://memory.dataram.com/products-and-services/software/ramdisk"&gt;DataRam RamDisk&lt;/a&gt; which supplies a free version with the ability to create a RAM disk up to 4 GB (1 or 2 GB should be sufficient for any build).&lt;/p&gt;
&lt;p&gt;Configuration of the RAM disk is very easy:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/arik/image_1F23A34A.png"&gt;&lt;img style="MARGIN:0px auto;DISPLAY:block;FLOAT:none;" title="image" alt="image" src="http://blogs.microsoft.co.il/blogs/arik/image_thumb_2E66DF8C.png" width="559" height="446" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;After you download, install and format your new RAM disk, you can move your single output folder to it. If you want to keep your output folder in the same build drive you can simply create a symbolic link between the current output folder and a folder on the RAM disk. This way makes the using of the RAM disk optional, only for users with sufficient memory.&lt;/p&gt;
&lt;p&gt;To create a symbolic link between your build folder and your new RAM disk folder use the following line:&lt;/p&gt;
&lt;p&gt;mklink /D &lt;b&gt;C:\Dev\MyCurrnetBuildFolder&lt;/b&gt;\Source\bin &lt;b&gt;R:\&lt;/b&gt;bin&lt;/p&gt;
&lt;p&gt;where R: is your RAM disk folder.&lt;/p&gt;
&lt;p&gt;Note: you should change the path according to your build folder and your RAM drive settings.&lt;/p&gt;
&lt;p&gt;Result: Adding the RAM disk reduced compilation time to less than 5 minutes! This is a 66% reduction of the original time!&lt;/p&gt;
&lt;h3&gt;Summary&lt;/h3&gt;
&lt;p&gt;In this post we’ve seen how you can decrease build time. Of course, I can’t make any guarantees. Every project has its own characteristics and problems, but the steps provided can probably reduce the build time if you’re fit the profile of standard line-of-business application.&lt;/p&gt;
&lt;p&gt;That’s it for now, &lt;br /&gt;Arik Poznanski.&lt;/p&gt;
&lt;div style="PADDING-BOTTOM:0px;MARGIN:0px;PADDING-LEFT:0px;PADDING-RIGHT:0px;PADDING-TOP:0px;" class="wlWriterHeaderFooter"&gt;&lt;a href="http://www.dotnetkicks.com/kick/?url=http://blogs.microsoft.co.il/blogs/arik/archive/2011/05/17/speed-up-visual-studio-builds.aspx"&gt;&lt;img border="0" alt="kick it on DotNetKicks.com" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://blogs.microsoft.co.il/blogs/arik/archive/2011/05/17/speed-up-visual-studio-builds.aspx&amp;amp;bgcolor=6600FF" /&gt;&lt;/a&gt; &lt;a href="http://dotnetshoutout.com/Submit?url=http://blogs.microsoft.co.il/blogs/arik/archive/2011/05/17/speed-up-visual-studio-builds.aspx"&gt;&lt;img style="BORDER-BOTTOM:0px;BORDER-LEFT:0px;BORDER-TOP:0px;BORDER-RIGHT:0px;" alt="Shout it" src="http://dotnetshoutout.com/image.axd?url=http://blogs.microsoft.co.il/blogs/arik/archive/2011/05/17/speed-up-visual-studio-builds.aspx" /&gt;&lt;/a&gt; &lt;a style="DISPLAY:none;" href="http://www.codeproject.com/script/Articles/BlogFeedList.aspx?amid=172641" rel="tag"&gt;CodeProject&lt;/a&gt; &lt;/div&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=835767" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/arik/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/arik/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://blogs.microsoft.co.il/blogs/arik/archive/tags/Build/default.aspx">Build</category><category domain="http://blogs.microsoft.co.il/blogs/arik/archive/tags/Parallel+Build/default.aspx">Parallel Build</category><category domain="http://blogs.microsoft.co.il/blogs/arik/archive/tags/Copy+Local/default.aspx">Copy Local</category><category domain="http://blogs.microsoft.co.il/blogs/arik/archive/tags/RAM+Disk/default.aspx">RAM Disk</category></item><item><title>How to Check How Many Writes Are Done While You Build?</title><link>http://blogs.microsoft.co.il/blogs/arik/archive/2011/05/10/how-to-check-how-many-writes-are-done-while-you-build.aspx</link><pubDate>Tue, 10 May 2011 16:35:48 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:834275</guid><dc:creator>arik</dc:creator><slash:comments>4</slash:comments><description>&lt;p&gt;In the following post I’ll show you how you can measure how many read and writes (in bytes) your build takes. This may prove useful since the amount of writes can have a tremendous effect on the build total time. More on how to shorten your build time in a future post.&lt;/p&gt;  &lt;h3&gt;Step 1: Download Process Monitor&lt;/h3&gt;  &lt;p&gt;The key for measuring the build read and writes is to download the great tool by Sysinternals, &lt;a href="http://technet.microsoft.com/en-us/sysinternals/bb896645"&gt;Process Monitor&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Process Monitor is a tool which monitors all the processes in your system for several activities, like: file-access, registry, etc. It has rich support for filtering and summarizing the information.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/arik/image_47E72440.png"&gt;&lt;img style="margin:0px auto;display:block;float:none;" title="image" alt="image" src="http://blogs.microsoft.co.il/blogs/arik/image_thumb_435D2B54.png" width="640" height="273" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;Step 2: Setup a filter on your build process&lt;/h3&gt;  &lt;p&gt;Select the “&lt;b&gt;Filter”&lt;/b&gt; menu and then “&lt;b&gt;Filter…&lt;/b&gt;” menu item.     &lt;br /&gt;Now add a new filter with “&lt;b&gt;Process Name&lt;/b&gt;” is “&lt;b&gt;devenv.exe&lt;/b&gt;”, or “&lt;b&gt;msbuild.exe&lt;/b&gt;”, depending on how you build your project.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/arik/image_2AAD426A.png"&gt;&lt;img style="margin:0px auto;display:block;float:none;" title="image" alt="image" src="http://blogs.microsoft.co.il/blogs/arik/image_thumb_605261F7.png" width="640" height="309" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Also disable all activities but the “file system” activity, since we want to focus on these alone.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/arik/image_1814804E.png"&gt;&lt;img style="margin:0px auto;display:block;float:none;" title="image" alt="image" src="http://blogs.microsoft.co.il/blogs/arik/image_thumb_6A833ABD.png" width="640" height="67" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;Step 3: Run your build process&lt;/h3&gt;  &lt;p&gt;Clear the captured data from the process monitor to get a clean screen.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/arik/image_1B55CC5C.png"&gt;&lt;img style="margin:0px auto;display:block;float:none;" title="image" alt="image" src="http://blogs.microsoft.co.il/blogs/arik/image_thumb_605E73C5.png" width="640" height="67" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Now invoke your build process with your favorite tool: &lt;b&gt;Visual Studio&lt;/b&gt; or &lt;b&gt;msbuild&lt;/b&gt;.&lt;/p&gt;  &lt;h3&gt;Step 4: Get the results&lt;/h3&gt;  &lt;p&gt;Select the “&lt;b&gt;Tools&lt;/b&gt;” menu and then “&lt;b&gt;File Summary…&lt;/b&gt;” menu item.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/arik/image_31B84516.png"&gt;&lt;img style="margin:0px auto;display:block;float:none;" title="image" alt="image" src="http://blogs.microsoft.co.il/blogs/arik/image_thumb_27835851.png" width="640" height="246" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Note: some file names were blacked to protect the client’s properties.&lt;/p&gt;  &lt;h3&gt;Step 5: Check by folder&lt;/h3&gt;  &lt;p&gt;Present the file summary by folders to get a better understanding on which folders you get most of the writes.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/arik/image_1EA32A38.png"&gt;&lt;img style="margin:0px auto;display:block;float:none;" title="image" alt="image" src="http://blogs.microsoft.co.il/blogs/arik/image_thumb_1D8AEEC1.png" width="640" height="252" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;This is it. Here you can already see exactly how many read and writes you are doing and also how much time was invested in those writes (check the File Time column).&lt;/p&gt;  &lt;p&gt;In a future post I’ll cover how you can decrease build time using this information.&lt;/p&gt;  &lt;p&gt;That’s it for now,    &lt;br /&gt;Arik Poznanski.&lt;/p&gt;&lt;div class="wlWriterHeaderFooter" style="margin:0px;padding:0px 0px 0px 0px;"&gt;&lt;a href="http://www.dotnetkicks.com/kick/?url=http://blogs.microsoft.co.il/blogs/arik/archive/2011/05/10/how-to-check-how-many-writes-are-done-while-you-build.aspx"&gt;&lt;img border="0" alt="kick it on DotNetKicks.com" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://blogs.microsoft.co.il/blogs/arik/archive/2011/05/10/how-to-check-how-many-writes-are-done-while-you-build.aspx&amp;amp;bgcolor=6600FF" /&gt;&lt;/a&gt; &lt;a href="http://dotnetshoutout.com/Submit?url=http://blogs.microsoft.co.il/blogs/arik/archive/2011/05/10/how-to-check-how-many-writes-are-done-while-you-build.aspx"&gt;&lt;img alt="Shout it" src="http://dotnetshoutout.com/image.axd?url=http://blogs.microsoft.co.il/blogs/arik/archive/2011/05/10/how-to-check-how-many-writes-are-done-while-you-build.aspx" style="border:0px;" /&gt;&lt;/a&gt; &lt;a href="http://www.codeproject.com/script/Articles/BlogFeedList.aspx?amid=172641" rel="tag" style="display:none;"&gt;CodeProject&lt;/a&gt; &lt;/div&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=834275" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/arik/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/arik/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://blogs.microsoft.co.il/blogs/arik/archive/tags/Performance/default.aspx">Performance</category><category domain="http://blogs.microsoft.co.il/blogs/arik/archive/tags/Build/default.aspx">Build</category><category domain="http://blogs.microsoft.co.il/blogs/arik/archive/tags/Process+Monitor/default.aspx">Process Monitor</category></item><item><title>Adding Missing WPF Controls To The Toolbox</title><link>http://blogs.microsoft.co.il/blogs/arik/archive/2010/12/01/adding-missing-wpf-controls-to-the-toolbox.aspx</link><pubDate>Wed, 01 Dec 2010 21:10:11 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:752035</guid><dc:creator>arik</dc:creator><slash:comments>4</slash:comments><description>&lt;p&gt;The other day I was teaching a WPF course when one of the students asked me where is the “&lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.shapes.line.aspx" target="_blank"&gt;Line&lt;/a&gt;” shape in the Visual Studio Toolbox.     &lt;br /&gt;I approach to show him, only to find out that this control is indeed missing from the Visual Studio 2010 Toolbox. Even if you search the alleged &lt;b&gt;&lt;/b&gt;“&lt;strong&gt;All&lt;/strong&gt; WPF Controls” tab..&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/arik/image_6E7BF1CE.png"&gt;&lt;img style="display:block;float:none;margin-left:auto;margin-right:auto;" title="image" alt="image" src="http://blogs.microsoft.co.il/blogs/arik/image_thumb_3D08A7D5.png" width="502" height="855" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;After a quick check I’ve found that this is not the only shape missing. The missing shapes are: &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.shapes.line.aspx" target="_blank"&gt;Line&lt;/a&gt;, &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.shapes.path.aspx" target="_blank"&gt;Path&lt;/a&gt;, &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.shapes.polygon.aspx" target="_blank"&gt;Polygon&lt;/a&gt;, &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.shapes.polyline.aspx" target="_blank"&gt;Polyline&lt;/a&gt;. And who knows which other controls are missing.&lt;/p&gt;  &lt;p&gt;Anyway, you can add this controls manually to the toolbox by following these steps:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Right-click the toolbox tab where you want to add a control (e.g. “All WPF Controls” and select “Choose Items”.      &lt;br /&gt;&lt;/li&gt; &lt;/ul&gt; &lt;a href="http://blogs.microsoft.co.il/blogs/arik/image_3F81B3C6.png"&gt;&lt;img style="display:block;float:none;margin-left:auto;margin-right:auto;" title="image" alt="image" src="http://blogs.microsoft.co.il/blogs/arik/image_thumb_7271442D.png" width="505" height="361" /&gt;&lt;/a&gt;&lt;/a&gt;   &lt;ul&gt;   &lt;li&gt;From the WPF Components tab choose the requested control (e.g. Line). You can use the Filter to help you find the control. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/arik/image_5A1E2A12.png"&gt;&lt;img style="display:block;float:none;margin-left:auto;margin-right:auto;" title="image" alt="image" src="http://blogs.microsoft.co.il/blogs/arik/image_thumb_1D398273.png" width="582" height="480" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;And there you go. Now you have the missing control where you want it. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/arik/image_28DEA3D8.png"&gt;&lt;img style="display:block;float:none;margin-left:auto;margin-right:auto;" title="image" alt="image" src="http://blogs.microsoft.co.il/blogs/arik/image_thumb_3FBD7554.png" width="264" height="430" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Note that it has a proper icon meaning the WPF team prepared this element to be on the toolbox, but somehow it slipped away.&lt;/p&gt;  &lt;p&gt;That’s it for now,    &lt;br /&gt;Arik Poznanski.     &lt;br /&gt;&lt;/p&gt;&lt;div class="wlWriterHeaderFooter" style="margin:0px;padding:0px 0px 0px 0px;"&gt;&lt;a href="http://www.dotnetkicks.com/kick/?url=http://blogs.microsoft.co.il/blogs/arik/archive/2010/12/01/adding-missing-wpf-controls-to-the-toolbox.aspx"&gt;&lt;img border="0" alt="kick it on DotNetKicks.com" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://blogs.microsoft.co.il/blogs/arik/archive/2010/12/01/adding-missing-wpf-controls-to-the-toolbox.aspx&amp;amp;bgcolor=6600FF" /&gt;&lt;/a&gt; &lt;a href="http://dotnetshoutout.com/Submit?url=http://blogs.microsoft.co.il/blogs/arik/archive/2010/12/01/adding-missing-wpf-controls-to-the-toolbox.aspx"&gt;&lt;img alt="Shout it" src="http://dotnetshoutout.com/image.axd?url=http://blogs.microsoft.co.il/blogs/arik/archive/2010/12/01/adding-missing-wpf-controls-to-the-toolbox.aspx" style="border:0px;" /&gt;&lt;/a&gt; &lt;a href="http://www.codeproject.com/script/Articles/BlogFeedList.aspx?amid=172641" rel="tag" style="display:none;"&gt;CodeProject&lt;/a&gt; &lt;/div&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=752035" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/arik/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/arik/archive/tags/WPF/default.aspx">WPF</category><category domain="http://blogs.microsoft.co.il/blogs/arik/archive/tags/Toolbox/default.aspx">Toolbox</category><category domain="http://blogs.microsoft.co.il/blogs/arik/archive/tags/Controls/default.aspx">Controls</category><category domain="http://blogs.microsoft.co.il/blogs/arik/archive/tags/Visual+Studio/default.aspx">Visual Studio</category></item></channel></rss>