<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Einar Egilsson &#187; Utilities</title>
	<atom:link href="http://einaregilsson.com/category/utilities/feed/" rel="self" type="application/rss+xml" />
	<link>http://einaregilsson.com</link>
	<description>A site for my programming pet projects</description>
	<lastBuildDate>Fri, 10 Feb 2012 09:54:49 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>ClipboardDiff Visual Studio Extension</title>
		<link>http://einaregilsson.com/clipboarddiff-visual-studio-extension/</link>
		<comments>http://einaregilsson.com/clipboarddiff-visual-studio-extension/#comments</comments>
		<pubDate>Fri, 29 Apr 2011 11:36:09 +0000</pubDate>
		<dc:creator>einar</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Extensions]]></category>
		<category><![CDATA[Plugins]]></category>
		<category><![CDATA[Utilities]]></category>
		<category><![CDATA[Visual Studio]]></category>

		<guid isPermaLink="false">http://tech.einaregilsson.com/?p=430</guid>
		<description><![CDATA[tl;dr: I made a Visual Studio 2010 extension, ClipboardDiff, which lets you diff selected text against the contents of the clipboard. Get it in the Visual Studio Gallery. Follow me on twitter @einaregilsson to get notified of updates and other cool extensions and stuff. At work I sometimes run into &#8220;evil twin&#8221; methods in our codebase. [...]]]></description>
			<content:encoded><![CDATA[<p><strong>tl;dr:</strong> I made a Visual Studio 2010 extension, ClipboardDiff, which lets you diff selected text against the contents of the clipboard. <a title="Download the extension" href="http://visualstudiogallery.msdn.microsoft.com/a7519ab0-6029-49f3-9243-a74d1718a5bb">Get it in the Visual Studio Gallery</a>.</p>
<p><em>Follow me on twitter <a href="http://twitter.com/einaregilsson">@einaregilsson</a> to get notified of updates and other cool extensions and stuff.</em></p>
<p><a href="http://einaregilsson.com/wp-content/uploads/2011/04/cdlogo.png"><img class="alignright size-full wp-image-432" title="ClipboardDiff Logo" src="http://einaregilsson.com/wp-content/uploads/2011/04/cdlogo.png" alt="" width="140" height="140" /></a>At work I sometimes run into &#8220;evil twin&#8221; methods in our codebase. Those are methods that at a glance look almost exactly the same and where one has obviously been copy pasted from the other but then they have gotten out of sync over time. In these cases I try to refactor the two methods into one and add parameters for any behaviour that was different in the two original methods. But it can be hard to tell exactly what has changed between the two methods, especially when they are dozens of lines each. When dealing with this I used to copy each of the methods into their own temp file and then run a diff tool on them. After doing this a few times I got annoyed at the process, and decided to automate it somehow.<br />
<span id="more-430"></span></p>
<p>I&#8217;ve been playing around with Visual Studio extensions a lot lately and so I decided to make one for this problem. The extension is called ClipboardDiff and is now available in the Visual Studio Gallery. The idea is that you copy the first part of text you want to compare, then you select the next part you want to compare and then run the command &#8216;Diff selection against clipboard&#8217;. The command is available by right clicking on the selected text, it&#8217;s at the bottom of the context menu, or you can invoke it with they keyboard combination Alt+Shift+J. If you want to bind it to another keyboard combination just go into Tools-&gt;Customize-&gt;Keyboard and search for &#8216;ClipboardDiff&#8217;, it&#8217;ll find the command.</p>
<p><a href="http://einaregilsson.com/wp-content/uploads/2011/04/cd.png"><img class="alignnone size-full wp-image-431" title="Running the diff command" src="http://einaregilsson.com/wp-content/uploads/2011/04/cd.png" alt="" width="522" height="381" /></a></p>
<p>You can self choose which diff tool to use, to configure it go to Tools-&gt;ClipboardDiff settings and there you can enter the path to your diff tool of choice, and the arguments you want to pass to it. The placeholder values $FILE1$ and $FILE2$ will be replaced by the temp file names once you invoke the diff command. ClipboardDiff knows the default locations of a few diff programs, so if you have Perforce Merge, Tortoise Diff or WinMerge installed you won&#8217;t have to configure anything (Those are just the tools I happened to have installed on my machine). If you haven&#8217;t configured which tool to use the Settings window will be opened the first time you try to run a diff.</p>
<p><a href="http://einaregilsson.com/wp-content/uploads/2011/04/settings.png"><img class="alignnone size-full wp-image-433" title="Configure which diff tool to use" src="http://einaregilsson.com/wp-content/uploads/2011/04/settings.png" alt="" width="560" height="145" /></a></p>
<p>You can <a title="Download the extension" href="http://visualstudiogallery.msdn.microsoft.com/a7519ab0-6029-49f3-9243-a74d1718a5bb">download the extension in the Visual Studio Gallery</a> and the source, as always, is GPL&#8217;d and available on Github at <a href="https://github.com/einaregilsson/ClipboardDiff">https://github.com/einaregilsson/ClipboardDiff</a>. Enjoy!</p>
]]></content:encoded>
			<wfw:commentRss>http://einaregilsson.com/clipboarddiff-visual-studio-extension/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Stop Build on first error in Visual Studio 2010</title>
		<link>http://einaregilsson.com/stop-build-on-first-error-in-visual-studio-2010/</link>
		<comments>http://einaregilsson.com/stop-build-on-first-error-in-visual-studio-2010/#comments</comments>
		<pubDate>Thu, 06 Jan 2011 08:08:48 +0000</pubDate>
		<dc:creator>einar</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Extensions]]></category>
		<category><![CDATA[Plugins]]></category>
		<category><![CDATA[Tips & Tricks]]></category>
		<category><![CDATA[Utilities]]></category>
		<category><![CDATA[Visual Studio]]></category>

		<guid isPermaLink="false">http://tech.einaregilsson.com/?p=426</guid>
		<description><![CDATA[tl;dr: StopOnFirstBuildError is Visual Studio 2010 extension that cancels the rest of a solution build if a single project fails to compile, thus saving you time. Download it in the Visual Studio Gallery. Follow me on twitter @einaregilsson to get notified of updates and other cool extensions and stuff. At work I often work on a [...]]]></description>
			<content:encoded><![CDATA[<p><strong>tl;dr:</strong> StopOnFirstBuildError is Visual Studio 2010 extension that cancels the rest of a solution build if a single project fails to compile, thus saving you time. <a href="http://visualstudiogallery.msdn.microsoft.com/en-us/91aaa139-5d3c-43a7-b39f-369196a84fa5">Download it in the Visual Studio Gallery</a>.</p>
<p><em>Follow me on twitter <a href="http://twitter.com/einaregilsson">@einaregilsson</a> to get notified of updates and other cool extensions and stuff.</em></p>
<p>At work I often work on a solution that has around 25 projects. When one of the projects fails to build, Visual Studio insists on trying to build the rest of the projects, even though at that point I don&#8217;t want it to, since I&#8217;m never going to run the program when some of the projects have failed. Often the other projects depend on the project that failed, and the error list gets filled with errors from those projects that just obscure the root cause of the problem. So, I figured I could probably do something about it.</p>
<p><span id="more-426"></span>I googled around for a solution and found a <a href="http://msdn.microsoft.com/en-us/library/microsoft.build.tasks.msbuild.stoponfirstfailure.aspx">StopOnFirstFailure</a> property in MSBuild that sounded promising, but I couldn&#8217;t find any good way to hook into the VS-&gt;MSBuild relationship. I&#8217;m sure there is some way to do this, so if anyone knows, please let me know. The next thing I found was a <a href="http://stevedunns.blogspot.com/2006/10/visual-studio-build-tip.html">tip from Steve Dunn</a>. It&#8217;s a nice little macro that listens for an event that is fired after each project is built, and calls the Cancel Build command if a project has failed to build. You just open the Macro IDE, open the EnvironmentEvents.vb file and paste the following code in at the bottom:</p>
<pre class="brush: vb; title: ; notranslate">
Private Sub BuildEvents_OnBuildProjConfigDone(
                   _ ByVal Project As String,
                   _ ByVal ProjectConfig As String,
                   _ ByVal Platform As String,
                   _ ByVal SolutionConfig As String,
                   _ ByVal Success As Boolean) Handles BuildEvents.OnBuildProjConfigDone
    If Success = False Then 'The build failed...cancel any further builds.
        DTE.ExecuteCommand(&quot;Build.Cancel&quot;)
    End If
End Sub
</pre>
<p>This does 95% of what I wanted to do. But still, I&#8217;m not a big fan of Visual Studio Macros, I prefer extensions where possible so I can easily see in one place what things I have installed instead of digging through the Macro projects. I also wanted to activate the error window after cancelling the build and be able to turn this on and off easily. So, I made an extension out of it. The main thing in it is still the macro code from Steve Dunn above, but in addition the extension:</p>
<ul>
<li>Activates the error list after cancelling the build.</li>
<li>Prints a message to the Build output window, saying why the build was cancelled.</li>
<li>Adds a menu item to the Build menu, &#8220;Stop Build on first error&#8221;, which you can use to turn the functionality on and off easily.</li>
<li>Is context aware, the menu item and functionality are only available in multi-project solutions, since it would be pretty useless in a single project solution.
</ul>
<p>And that&#8217;s it. You can <a href="http://visualstudiogallery.msdn.microsoft.com/en-us/91aaa139-5d3c-43a7-b39f-369196a84fa5">download the extension</a> in the Visual Studio Gallery, get the GPL&#8217;d source code at <a href="https://github.com/einaregilsson/StopOnFirstBuildError">https://github.com/einaregilsson/StopOnFirstBuildError</a> and follow me on Twitter <a href="http://twitter.com/einaregilsson">@einaregilsson</a> to get notified of updates and other new extensions. Enjoy!</p>
]]></content:encoded>
			<wfw:commentRss>http://einaregilsson.com/stop-build-on-first-error-in-visual-studio-2010/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Better EventHandler names in Visual Studio 2010</title>
		<link>http://einaregilsson.com/better-eventhandler-names-in-visual-studio-2010/</link>
		<comments>http://einaregilsson.com/better-eventhandler-names-in-visual-studio-2010/#comments</comments>
		<pubDate>Wed, 22 Dec 2010 20:36:14 +0000</pubDate>
		<dc:creator>einar</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Extensions]]></category>
		<category><![CDATA[Utilities]]></category>
		<category><![CDATA[Visual Studio]]></category>

		<guid isPermaLink="false">http://tech.einaregilsson.com/?p=422</guid>
		<description><![CDATA[tl;dr: I made a Visual Studio extension, EventHandler Naming, that lets you customize generated eventhandler names and use delegate inference. Not perfect, but works. Download it in the Visual Studio Gallery Follow me on twitter @einaregilsson to get notified of updates and other cool extensions and stuff. The problem I&#8217;ve been annoyed by the eventhandler [...]]]></description>
			<content:encoded><![CDATA[<p><strong>tl;dr:</strong> I made a Visual Studio extension, EventHandler Naming, that lets you customize generated eventhandler names and use delegate inference. Not perfect, but works. <a href="http://visualstudiogallery.msdn.microsoft.com/en-us/14f62cb9-b559-4bad-9388-37da2150e238?SRC=Home">Download it in the Visual Studio Gallery</a></p>
<p><em>Follow me on twitter <a href="http://twitter.com/einaregilsson">@einaregilsson</a> to get notified of updates and other cool extensions and stuff.</em></p>
<h3>The problem</h3>
<p>I&#8217;ve been annoyed by the eventhandler names generated by Visual Studio for years. No, I don&#8217;t really want to name my methods <strong>txtName_TextChanged</strong>, which does not match any reasonable naming convention and looks ugly. I usually prefer something like <strong>OnNameTextChanged</strong> or something similar. Another thing that has annoyed me is</p>
<pre class="brush: csharp; title: ; notranslate">
this.Load +=new EventHandler(OnLoad);
</pre>
<p>instead of just</p>
<pre class="brush: csharp; title: ; notranslate">
this.Load += OnLoad;
</pre>
<p>So, I figured I could probably hack something together to fix these problems fairly easily. As it turns out, some of it was easy, some of it was hard and some of it was impossible.</p>
<p><span id="more-422"></span></p>
<h3>How do you use it?</h3>
<p><a href="http://einaregilsson.com/wp-content/uploads/2010/12/options.png"><img class="alignright size-full wp-image-424" title="options" src="http://einaregilsson.com/wp-content/uploads/2010/12/options.png" alt="" width="309" height="259" /></a></p>
<p>In the Tools menu there is a new menu item, EventHandler Naming. That will give you the options window shown here. The <em>&#8220;Pattern&#8221;</em> is what is used to create the eventhandler names, you can use two macros there, $(EventName) and $(SiteName). EventName is pretty self explanatory, but the SiteName can be the name of the variable/component that owns the event being subscribed to, the typename of the type that owns the event (in the case of static events) or again the typename if you are subscribing to events within the class that owns the event. For both $(SiteName) and $(EventName) you can specify simple transforms like changing the case to camelCase, PascalCase, UPPERCASE or lowercase.</p>
<p>The<em> &#8220;Omit $(SiteName) for own events&#8221;</em> is for the case where you are subscribing to your own, or a base class event. At least for me, if I&#8217;m in a form and am subscribing to its Load event I don&#8217;t want the handler to be named <strong>OnForm1Load</strong>, I just want it to be named <strong>OnLoad</strong>. Whereas if I&#8217;m subscribing to an event from some variable then I want the variable name (sitename) to be a part of the event handler name.</p>
<p>The <em>&#8220;Use delegate inference&#8221;</em> does what is says. Instead of getting <strong>+= new EventHandler(someName)</strong> you will get <strong>+= someName</strong>.</p>
<h3>Implementation: WinForms and WebForms</h3>
<p>Luckily the Win and WebForms designers have a fairly nice API that you can hook into. I just created my own implementation of <strong>IEventBindingService</strong> and implemented the <strong>CreateUniqueMethodName</strong> method. For all other methods I just delegated to the real event binding service. The code to hook that up is as follows:</p>
<pre class="brush: csharp; title: ; notranslate">
    internal class DesignerCreationListener
    {
        internal DesignerCreationListener(IDesignerEventService designerEvents) {
            designerEvents.DesignerCreated += (s, e) =&gt; e.Designer.LoadComplete += OnDesignerLoaded;
        }

        private void OnDesignerLoaded(object sender, EventArgs e)
        {
            IDesignerHost host = sender as IDesignerHost;
            if (host == null)
            {
                return;
            }
            host.LoadComplete -= OnDesignerLoaded;

            Type type = typeof(IEventBindingService);
            IEventBindingService originalService = (IEventBindingService) host.GetService(type);
            if (originalService == null)
            {
                return;
            }

            host.RemoveService(type);
            host.AddService(type, new DesignerEventBindingService(originalService, new PatternNameProvider()));
        }
    }
</pre>
<p><strong>DesignerEventBindingService</strong> is my class, which takes the <strong>originalService</strong> in its constructor and delegates to it as necessary.</p>
<h3>Implementation: Code Window</h3>
<p>The code window implementation is basically a big hack. It&#8217;s the C# language service that takes care of inserting event handlers there and it basically has no hooks or extension points at all. (I would love it if someone proves me wrong on this). So, here I&#8217;m basically listening to two events, <strong>BeforeKeyPress </strong>and <strong>AfterKeyPress</strong>. I&#8217;m just checking whether the keypress is a tab key, doing some heuristics to make sure that we&#8217;re actually creating eventhandlers and not just pressing tab in some arbitrary place.</p>
<p>This is the reason why you get the old eventhandler name in the tooltip first after you press +=, the new name only comes after the delegate constructor is created. I tried everything I could think of to fix that, but the language service itself is responsible for showing that tooltip and drawing text on it and I can&#8217;t hook into that.</p>
<p>The language service is also the reason I have to show the delegate constructor while we are creating the name and only remove the explicit constructor afterwards for delegate inference. If I mess with the delegate constructor before the method is created then the language service just aborts the operation and the next tab key stroke won&#8217;t do anything.</p>
<p>So, overall it&#8217;s missing some things, but for the most part it does what you&#8217;d want.</p>
<h3>Implementation: WPF / XAML</h3>
<p>And this is the impossible part. The XAML designer doesn&#8217;t use the IDesignerHost interface at all, and as far as I could tell from looking at the VSX forum there is just no way to really extend the XAML editor in any meaningful way. It&#8217;s disappointing that they didn&#8217;t use the excellent IEventBindingService there, if someone knows a way that I could hook in here then please let me know.</p>
<h3>Conclusion</h3>
<p>I hope you find the extension useful, the source is GPL and available at<a href="https://github.com/einaregilsson/EventHandlerNaming"> https://github.com/einaregilsson/EventHandlerNaming</a> . If you have any tips, suggestions, or bug requests send me an email or a tweet at <a href="http://twitter.com/einaregilsson">@einaregilsson</a>.  And please tweet and share this if you like it <img src='http://einaregilsson.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 415px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">﻿</div>
]]></content:encoded>
			<wfw:commentRss>http://einaregilsson.com/better-eventhandler-names-in-visual-studio-2010/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Module initializers in C#</title>
		<link>http://einaregilsson.com/module-initializers-in-csharp/</link>
		<comments>http://einaregilsson.com/module-initializers-in-csharp/#comments</comments>
		<pubDate>Wed, 16 Dec 2009 15:34:01 +0000</pubDate>
		<dc:creator>einar</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Utilities]]></category>
		<category><![CDATA[Visual Studio]]></category>

		<guid isPermaLink="false">http://tech.einaregilsson.com/?p=352</guid>
		<description><![CDATA[One feature of the CLR that is not available in C# or VB.NET are module initializers (or module constructors). A module initializer is simply a global function which is named .cctor and marked with the attributes SpecialName and RTSpecialName. It is run when a module (each .NET assembly is comprised of one or more modules, [...]]]></description>
			<content:encoded><![CDATA[<p>One feature of the CLR that is not available in C# or VB.NET are module initializers (or module constructors). A module initializer is simply a global function which is named .cctor and marked with the attributes SpecialName and RTSpecialName. It is run when a module <small>(each .NET assembly is comprised of one or more modules, typically just one)</small> is loaded for the first time, and is guaranteed to run before any other code in the module runs, before any type initializers, static constructors or any other initialization code. I wanted to use this feature for a project I was doing but was unable to use it directly in C# so I created my own solution. <span id="more-352"></span></p>
<p>Now, why did I need this? Well, I was loading my other assemblies from an unusual place and I wanted to subscribe to the AppDomain.AssemblyResolve event before any types in my assembly were initialized. This feature is clearly not something you&#8217;re going to need every day, (actually I can&#8217;t think of a single other use case where I&#8217;d need it) but if you do, here&#8217;s how I solved it.</p>
<p>I used the excellent <a href="http://www.mono-project.com/Cecil">Mono.Cecil</a> library to create a small program that injects a module initializer into an existing assembly. Cecil is a fantastic library that makes it incredibly easy to manipulate assemblies and can do pretty much anything that you could possibly want to do with IL code. Using it I wrote a small program that simply takes in an assembly filename and the name of a parameterless static void method that exists in the assembly, and injects a module initializer that does nothing but call that method. The original code I wrote, the interesting part without all the error checking and stuff, is shown below:</p>
<pre class="brush: csharp; title: ; notranslate">
string assemblyName = &quot;Test.dll&quot;;
string typeName = &quot;Foo.Bar.ModuleInit&quot;;
string methodName = &quot;Run&quot;;

AssemblyDefinition assembly = AssemblyFactory.GetAssembly (assemblyName);
TypeReference voidRef = assembly.MainModule.Import(typeof(void));
var attributes = MethodAttributes.Static
                | MethodAttributes.SpecialName
                | MethodAttributes.RTSpecialName;
var cctor = new MethodDefinition( &quot;.cctor&quot;, attributes, voidRef);

TypeDefinition type = assembly.MainModule.Types[typeName];
MethodReference methodRef = type.Methods.GetMethod(methodName,new Type[]{});
cctor.Body.CilWorker.Append(cctor.Body.CilWorker.Create(OpCodes.Call, methodRef));
cctor.Body.CilWorker.Append(cctor.Body.CilWorker.Create(OpCodes.Ret));
assembly.MainModule.Inject(cctor, assembly.MainModule.Types[&quot;&lt;Module&gt;&quot;]);
AssemblyFactory.SaveAssembly(assembly, assemblyName);
</pre>
<p>I then added all the neccessary error handling, unit testing etc. and the resulting program can be <a href="/download/InjectModuleInitializer.exe">downloaded here</a>. The program is just a single executable since I embedded the Cecil assemblies as resources and load them by handling the AppDomain.Current.AssemblyResolve event. You can run it from the command line and give it the filename of your assembly and optionally specify the method to call and a key file to strong name sign the assembly after the injection. If no method is explicitly specified then the program looks for a type named ModuleInitializer (may be in any namespace) and looks for a method named Run in that type and calls that method in the module initializer.</p>
<p>Run without specifying the method, looks for ModuleInitializer::Run in any namespace.</p>
<p class="console"> InjectModuleInitializer.exe Test.dll</p>
<p>Run and specify the method as Foo.Bar.SomeClass::SomeMethod</p>
<p class="console"> InjectModuleInitializer.exe /m:Foo.Bar.SomeClass::SomeMethod Test.dll</p>
<p>Run and specify a keyfile to use for strong name signing</p>
<p class="console"> InjectModuleInitializer.exe /k:mykeyfile.snk Test.dll</p>
<p>Realistically though, if you want to do this you probably want to do it right after building your assembly.  The best way to do that is to use the &lt;Exec/&gt; command in MSBuild in the AfterBuild target. To do that you can have the following in your .csproj file:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;Target Name=&quot;AfterBuild&quot;&gt;
    &lt;Exec Command='InjectModuleInitializer.exe &quot;$(TargetPath)&quot;' /&gt;
&lt;/Target&gt;
</pre>
<p>Or, if you want to explicitly specify the method to run:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;Target Name=&quot;AfterBuild&quot;&gt;
    &lt;Exec Command='InjectModuleInitializer.exe /m:MyNameSpace.MyClassName::MyMethodName &quot;$(TargetPath)&quot;' /&gt;
&lt;/Target&gt;
</pre>
<p>If you have set up your project to sign your assembly you will have the name of the strong name file in the $(AssemblyOriginatorKeyFile) variable. You can sign the assembly after the injection with:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;Target Name=&quot;AfterBuild&quot;&gt;
    &lt;Exec Command=&quot;InjectModuleInitializer.exe /k:&quot;$(AssemblyOriginatorKeyFile)&quot; /m:MyNameSpace.MyClassName::MyMethodName &quot;$(TargetPath)&quot; /&gt;
&lt;/Target&gt;
</pre>
<p>And there you have it. You can <a href="/download/InjectModuleInitializer.exe">download the console program</a> or <a href="https://github.com/einaregilsson/InjectModuleInitializer">get the source on GitHub</a> and build it yourself (You can download a zip file there if you don&#8217;t want to mess with Git). Enjoy.</p>
<div style="font-size:14px">
<strong>UPDATE 03.02.2012: </strong> Now updated to version 1.3. Dropped MSBuild support, although it can of course still be used in MSBuild with the Exec command. Added support for strong name signing</p>
<p><strong>UPDATE 12.01.2012: </strong> Now updated to version 1.2. Supports injecting into .NET 2.0 and .NET 4.0 assemblies. Source code now lives on github at <a href="https://github.com/einaregilsson/InjectModuleInitializer">https://github.com/einaregilsson/InjectModuleInitializer</a>.</p>
<p><strong>UPDATE 04.05.2010: </strong> Now updated to version 1.1 with better support for Pdb files and using Mono.Cecil v0.9 instead of 0.6. That also means that the simple example in the blog post is no longer like the actual code, since Mono.Cecil changed drastically between versions. Thanks to Jonathan Evans for his help in figuring out how to get debug symbols to work correctly.
</div>
]]></content:encoded>
			<wfw:commentRss>http://einaregilsson.com/module-initializers-in-csharp/feed/</wfw:commentRss>
		<slash:comments>33</slash:comments>
		</item>
		<item>
		<title>ZenCoding Visual Studio AddIn</title>
		<link>http://einaregilsson.com/zen-coding-visual-studio-addin/</link>
		<comments>http://einaregilsson.com/zen-coding-visual-studio-addin/#comments</comments>
		<pubDate>Thu, 12 Nov 2009 23:05:08 +0000</pubDate>
		<dc:creator>einar</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Extensions]]></category>
		<category><![CDATA[Plugins]]></category>
		<category><![CDATA[Utilities]]></category>
		<category><![CDATA[Visual Studio]]></category>
		<category><![CDATA[ZenCoding]]></category>

		<guid isPermaLink="false">http://tech.einaregilsson.com/?p=289</guid>
		<description><![CDATA[4 Feb 2010: I&#8217;m no longer working on this addin and cannot provide support for failed installations. I gave some information about possible causes for failed installations in this comment, you can see if that helps, or discuss with other users in the comments. There are unlikely to ever be new versions of this addin [...]]]></description>
			<content:encoded><![CDATA[<p><strong>4 Feb 2010:</strong> I&#8217;m no longer working on this addin and cannot provide support for failed installations. I gave some information about possible causes for failed installations in <a href="http://einaregilsson.com/2009/11/12/zen-coding-visual-studio-addin/#comment-70702">this comment</a>, you can see if that helps, or discuss with other users in the comments. There are unlikely to ever be new versions of this addin published by me, but Boris Sevo has forked the project and has a version with a newer zencoding library at <a href="http://zencoding.codeplex.com/">http://zencoding.codeplex.com/</a>. So go there for updates <img src='http://einaregilsson.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>The original blog post about the architecture of the addin is now completely out of date as 90% of the addin is now written in IronPython with just a tiny shim layer of C# to instantiate the IronPython classes. I&#8217;ll probably write a blog post about that architecture seperately (or generally about how to write addins for VS in IronPython). Those interested in the architecture can download the source and look at it.</p>
<p>A nice tutorial with screenshots on how to setup the keyboard mappings and use the addin has just been posted at <a href="http://www.netsi.dk/wordpress/index.php/2009/12/02/zen-coding-a-very-fast-way-of-generating-html-elements-in-your-editor/">http://www.netsi.dk/wordpress/index.php/2009/12/02/zen-coding-a-very-fast-way-of-generating-html-elements-in-your-editor/</a> so go there for your setup instructions. <del>And there is now a dedicated rss feed for updates at <a href="http://einaregilsson.com/zcupdates.aspx ">http://einaregilsson.com/zcupdates.aspx </a>so subscribe to that to be notified of new versions. Eventually I&#8217;ll put an update check in the addin itself.</del></p>
<p><strong>ZenCoding.VisualStudio v1.1.0.333</strong></p>
<p><a title="MSI installer for the add-in" href="http://einaregilsson.com/download/ZenCoding.VisualStudio.msi">DOWNLOAD ADD-IN</a> || <a title="Download zip file with source code" href="http://einaregilsson.com/download/ZenCoding.VisualStudio.zip">DOWNLOAD SOURCE</a></p>
<p><span id="more-289"></span><strong>RELEASE NOTES:</strong></p>
<p><strong>Version 1.1.0.333, 02.12.2009:</strong></p>
<p>This release adds the following features</p>
<ul>
<li>Uses latest version of zencoding python library</li>
<li>Wrap with abbreviation command</li>
<li>Use, create, edit, delete custom snippets (Tools-&gt;Options-&gt;ZenCoding)</li>
<li>Icons for commands</li>
<li>Some bug fixes</li>
</ul>
<p>Also a total rewrite with everything now written in IronPython</p>
<p><strong>Version 1.0, 12.11.2009:</strong></p>
<p>Initial release, features:</p>
<ul>
<li>Expand abbreviation</li>
</ul>
<p><strong>Original blog post follows:</strong></p>
<p>Earlier this week, while reading <a href="http://secretgeek.net">Leon Bambrick&#8217;s blog</a> I learned about a set of plugins, named &#8220;zen-coding&#8221;, which expand snippets of css-selector like code into full blown html and/or css elements. <a href="http://secretgeek.net/zen_coding.asp">Leon&#8217;s article</a> explains it better and there is also some documentation on the <a href="http://code.google.com/p/zen-coding/">official zen-coding page</a>. Anyway, this plugin is available for a number of text editors and IDE&#8217;s but not for Visual Studio. I use Visual Studio a lot and wanted zen-coding in there, so I decided to try and whip up a small add-in for it.</p>
<p>The original library is available both as JavaScript and Python. I really didn&#8217;t want to port or alter anything in the original code, since for future versions I want to be able to just drop in a couple of files from the original library and rebuild the add-in. The obvious choice then was to see if the library would work with IronPython. Fortunately the zen-coding library is just basic string manipulation and worked perfectly with IronPython right out of the box.</p>
<p>The next challenge was figuring out how to call into that from the add-in, which I wanted to write in C#. The library contained two functions I needed to be able to call. That turned out to be surprisingly easy. <del>I made a wrapper class, ZenCodingEngine, which has two delegates with the correct method signatures, and then in its constructor I ran some custom python import code, and got references to the functions I needed and assigned them to my delegates.</del> I changed that approach in the latest version and moved almost all of the logic into Python instead. Now the C# AddIn is very thin, it basically just receives events from VS and invokes a single exec_command() method that is defined in a python script. The interesting parts of that code are below:</p>
<pre class="brush: csharp; title: ; notranslate">
private void ReloadPython()
{
  ScriptEngine engine = Python.CreateEngine();
  ScriptScope scope = engine.CreateScope();
  string folder = Path.GetDirectoryName(new
    Uri(Assembly.GetExecutingAssembly().CodeBase).LocalPath);
  List searchPaths = new List&lt;string&gt;(engine.GetSearchPaths());
  searchPaths.Add(folder);
  engine.SetSearchPaths(searchPaths);
  scope = engine.ExecuteFile(Path.Combine(folder, &quot;vs_zen_coding.py&quot;));
  engine.SetVariable(scope, &quot;App&quot;, _applicationObject);
  execCommand = engine.GetVariable&lt;Func&lt;bool&gt;&gt;(scope, &quot;exec_command&quot;);
}

public void Exec(string commandName, vsCommandExecOption executeOption, ref object varIn, ref object varOut, ref bool handled)
{
  handled = false;
  if (!CanExecuteCommand(commandName, executeOption))
  {
    return;
  }

  try
  {
    #if RELOAD_EVERY_TIME
    ReloadPython();
    #else
    if (execCommand == null)
    {
      //Load first time, to avoid making the VS startup slower
      ReloadPython();
    }
    #endif

    execCommand();
  }
  catch (Exception ex)
  {
    DisplayError(ex);
  }
  handled = true;
}</pre>
<p>The ReloadPython() method is not called on startup, instead it is called the first time the command is called. IronPython performs well, but there is still some startup cost and I don&#8217;t want to add that to the startup time of Visual Studio. Instead you pay the price the first time you actually need it. Then we have the Exec method which is from a VS interface and is called when the command is invoked. There I use a compilation constant, RELOAD_EVERY_TIME, to check if I should reload my python script every time I invoke the command. This has proved to be INCREDIBLY useful, instead of constantly starting VS up again and again I just edit my python script, save it and the next time I execute the command the new code is used. And of course I turn this constant off for release builds.</p>
<p>Another nice trick to play around with the VS API, start up an IronPython shell and type:</p>
<div style="background-color:black; color:white;">
&gt;&gt;&gt; from System.Runtime.InteropServices import Marshal<br />
&gt;&gt;&gt; app = Marshal.GetActiveObject(&#8220;VisualStudio.DTE.9.0&#8243;)<br />
&gt;&gt;&gt; app.ActiveDocument.Name<br />
&#8216;ZenCodingAddIn.cs&#8217;
</div>
<p>This gets you a reference to the running instance of VS2009 which you can then experiment with.</p>
<p>You can download <a href="/download/ZenCoding.VisualStudio.msi">an installer</a> for the add-in or get <a href="/download/ZenCoding.VisualStudio.zip">the source</a>. The add-in is licensed under the GPL v3, the same license the zen-coding library uses. The add-in works for Visual Studio 2005, 2008 and 2010 beta 2.</p>
<p>Now, once you&#8217;ve installed the add-in, nothing happens. Well, actually what happens is there&#8217;s a new command available in Visual Studio, named <strong>ZenCoding.Expand</strong>, or <strong>ZenCoding.VisualStudio.ZenCodingAddIn.Expand</strong>, depending on where you are looking for it. (The keyboard mapping uses the full command id, but when adding it to a toolbar you get a shorter friendly name for it). By default it is not mapped to any keyboard combination. This is because <del>it&#8217;s late and I can&#8217;t be bothered to figure it out</del> I strongly believe that add-ins should not force a keyboard shortcut on you, possibly overriding something you have set yourself. So, map the command to your preferred keyboard shortcut (mine is Ctrl+E,Ctrl+K). Or you can drag the command  onto a toolbar, which is fairly useless, but possible.</p>
<p>Enjoy!</p>
<p><strong>UPDATE 13.11.2009: </strong> The main zen-coding developer also told me that I&#8217;m using an older version, the latest version has a lot more features, including user defined snippets. I&#8217;ll start looking at that when I have time, which won&#8217;t be just yet. </p>
]]></content:encoded>
			<wfw:commentRss>http://einaregilsson.com/zen-coding-visual-studio-addin/feed/</wfw:commentRss>
		<slash:comments>44</slash:comments>
		</item>
		<item>
		<title>Instant Rimshot</title>
		<link>http://einaregilsson.com/instant-rimshot/</link>
		<comments>http://einaregilsson.com/instant-rimshot/#comments</comments>
		<pubDate>Sat, 20 Jun 2009 08:52:20 +0000</pubDate>
		<dc:creator>einar</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Utilities]]></category>

		<guid isPermaLink="false">http://tech.einaregilsson.com/?p=234</guid>
		<description><![CDATA[It&#8217;s been a while since I&#8217;ve written anything here, I&#8217;ve been working on my master project like crazy, have a 6 month old baby and so haven&#8217;t had much time for programming pet projects. Tonight I spent a half hour making perhaps the most useless application I&#8217;ll ever make. It&#8217;s based on the single-serving website [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s been a while since I&#8217;ve written anything here, I&#8217;ve been working on my master project like crazy, have a 6 month old baby and so haven&#8217;t had much time for programming pet projects. Tonight I spent a half hour making perhaps the most useless application I&#8217;ll ever make. It&#8217;s based on the single-serving website <a href="http://instantrimshot.com">http://instantrimshot.com</a> which only has one huge red button, if you press it a rimshot sound is played. I thought it might be fun to have that available as a keyboard shortcut in windows, and then I started wondering how it could be done in C#.</p>
<p><span id="more-234"></span></p>
<p>The only way to get a global keyboard working in .NET is by calling into the Win32 API. To register a global hotkey there is the aptly named function <a href="http://www.pinvoke.net/default.aspx/user32/RegisterHotKey.html">RegisterHotKey</a>. That requires you to have a window handle however, and I wanted to make the application as simple as possible, so I used a lower level API call,<br />
<a href="http://www.pinvoke.net/default.aspx/user32/SetWindowsHookEx.html">SetWindowsHookEx</a> which lets you get notified of all keyboard activity on the system. I then check what keys are pressed and when the combination Ctrl+Shift+I is pressed the sound is played. There is only one way to exit the app, and that is by pressing the keyboard combination Ctrl+Shift+Alt+I, that cleans up the hook before exiting. So, the code is shown below, you can <a href="http://einaregilsson.com/download/InstantRimshot.zip">download the source</a> or just <a href="http://einaregilsson.com/download/InstantRimshot.exe">download the program itself</a>. Enjoy!
</p>
<pre class="brush: csharp; title: ; notranslate">
using System;
using System.IO;
using System.Media;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Windows.Forms;

class InstantRimshot {

    const int WH_KEYBOARD_LL = 13;
    const int WM_KEYDOWN = 0x100;

    delegate int Hook(int code, IntPtr wParam, IntPtr lParam);

    [DllImport(&quot;user32.dll&quot;)]
    static extern IntPtr SetWindowsHookEx(int code,
                                          Hook func,
                                          IntPtr hInstance,
                                          int threadID);

    [DllImport(&quot;user32.dll&quot;)]
    static extern int UnhookWindowsHookEx(IntPtr hookHandle);

    [DllImport(&quot;user32.dll&quot;)]
    static extern int CallNextHookEx(IntPtr hhook,
                                     int code,
                                     IntPtr wParam,
                                     IntPtr lParam);

    static bool IsPressed(Keys check) {
        return ((Control.ModifierKeys &amp;#038; check) == check);
    }

    static void Main() {

        Stream sound = Assembly.GetExecutingAssembly()
            .GetManifestResourceStream(&quot;InstantRimshot.rimshot.wav&quot;);
        SoundPlayer player = new SoundPlayer(sound);
        player.Load();
        IntPtr hookHandle = IntPtr.Zero;
        hookHandle = SetWindowsHookEx(WH_KEYBOARD_LL,
            delegate(int code, IntPtr wParam, IntPtr lParam) {
                if (code &gt;= 0 &amp;#038;&amp; wParam == (IntPtr) WM_KEYDOWN) {
                    Keys vkCode = (Keys)Marshal.ReadInt32(lParam);
                    if (Keys.I == vkCode
                    &amp;#038;&amp; IsPressed(Keys.Control)
                    &amp;#038;&amp; IsPressed(Keys.Shift)) {
                        if (IsPressed(Keys.Alt)) {
                            UnhookWindowsHookEx(hookHandle);
                            Application.Exit();
                            return CallNextHookEx(hookHandle, code, wParam, lParam);
                        } else {
                            player.Play();
                        }
                    }
                }
                return CallNextHookEx(hookHandle, code, wParam, lParam);
            }, IntPtr.Zero, 0);
        Application.Run();
    }

}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://einaregilsson.com/instant-rimshot/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JScript REPL</title>
		<link>http://einaregilsson.com/jscript-repl/</link>
		<comments>http://einaregilsson.com/jscript-repl/#comments</comments>
		<pubDate>Fri, 20 Feb 2009 20:09:02 +0000</pubDate>
		<dc:creator>einar</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Tips & Tricks]]></category>
		<category><![CDATA[Utilities]]></category>

		<guid isPermaLink="false">http://tech.einaregilsson.com/?p=197</guid>
		<description><![CDATA[Lately I have been doing some COM automation stuff on Windows. I&#8217;ve been using JScript (Microsoft&#8217;s JavaScript implementation) since that&#8217;s available on all Windows machines, and the other option, VBScript, is horrible. Normally I would use Python and the win32com package, but I needed to make some scripts that could work on any box without [...]]]></description>
			<content:encoded><![CDATA[<p>Lately I have been doing some COM automation stuff on Windows. I&#8217;ve been using JScript (Microsoft&#8217;s JavaScript implementation) since that&#8217;s available on all Windows machines, and the other option, VBScript, is horrible. Normally I would use Python and the win32com package, but I needed to make some scripts that could work on any box without installing Python first. JScript is a pretty nice language, but it doesn&#8217;t come with a <a href="http://en.wikipedia.org/wiki/Read-eval-print_loop">REPL</a> built in, which is very handy when you&#8217;re doing experimental stuff (REPL = Read-Execute-Print-Loop). Now, writing your own REPL in a dynamic language with an <strong>eval</strong> statement is pretty easy, so I did just that. It took about 30 lines, of which about 10 are just about printing evaluated expressions nicely. <span id="more-197"></span></p>
<p>Here&#8217;s how it works. If you enter a single line that ends with ; it is evaluated immediately. If it doesn&#8217;t start with if,while,var,try,do,with,function,switch,for or print it is assumed to be an expression and its value is printed to the screen. If a new line doesn&#8217;t end with ; is is assumed to be the beginning of a larger code block. In that case the script will keep reading in code without evaluating until either you end a line with ;; or you enter a line which consists of only one ;. The script also includes a convenience function called print() to print expressions. The script just uses a single variable, _$, so it won&#8217;t conflict with variables you define when using it. Writing a single line with just the word &#8216;exit&#8217; will stop the script. Below you can see an example of the usage of the REPL. This sample is actually a online version that I did for fun, you can write in any command in it and try it out, it works exactly the same as the real script, although the online version took quite a bit more code. It even has command history, activated with the up and down arrow keys. (There are some issues in Internet Explorer, tab key doesn&#8217;t work and strings with html entities my display incorrectly, because of <a href="http://stud3.tuwien.ac.at/~e0226430/innerHtmlQuirk.html">weird behaviour with &lt;pre&gt; tags and the .innerHTML property).</a></p>
<p><a href="http://einaregilsson.com/download/jsrepl.js">Download script</a> | <a href="http://einaregilsson.com/download/jsrepl.js.html">View script syntax highlighted</a></p>
<p><iframe src="http://einaregilsson.com/repl.html" style="width:620px; height:400px;overflow-x:hidden; border-style:none; border:solid 0px black;" frameborder="0"></iframe></p>
<p>Enjoy!</p>
]]></content:encoded>
			<wfw:commentRss>http://einaregilsson.com/jscript-repl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Subtitle Fixer</title>
		<link>http://einaregilsson.com/subtitle-fixer/</link>
		<comments>http://einaregilsson.com/subtitle-fixer/#comments</comments>
		<pubDate>Thu, 20 Mar 2008 13:04:13 +0000</pubDate>
		<dc:creator>einar</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Utilities]]></category>

		<guid isPermaLink="false">http://tech.einaregilsson.com/2008/03/20/subtitle-fixer/</guid>
		<description><![CDATA[I was watching a movie on my computer the other day and I had gotten the subtitles for it off the internet, I think from http://opensubtitles.com or something like that. The only problem was that they were a bit out of sync with the picture, about 2 seconds too late. Using a good media player, [...]]]></description>
			<content:encoded><![CDATA[<p>I was watching a movie on my computer the other day and I had gotten the subtitles for it off the internet, I think from <a href="http://opensubtitles.com">http://opensubtitles.com</a> or something like that. The only problem was that they were a bit out of sync with the picture, about 2 seconds too late. Using a good media player, such as <a href="http://videolan.org">VLC</a> you can add an offset to the subtitles every time you watch the movie but I figured I could probably whip up a small script to do it for me so I could just do it once and then have the subtitles correct every time I watched the movie. <span id="more-58"></span> The subtitles were in the .srt format, which is basically just a very simple text file with time information and the text, a typical screen is something like</p>
<pre>
00:20:24,345 --> 00:20:25,200
Hello there.
How are you?
</pre>
<p>So I created a little script, suboffset.py, which takes in the name of a subtitle file and the offset to add to the file in milliseconds, modifies the file contents and writes it back out to the same file. Alternately you can specify &#8211; as the filename and then the script will read the file from stdin and write the output to stdout so you can pipe it together to write to another file. The original script was about 10 lines, but just to make it a little more useful I made it a module so you could get access to the script from other scripts and added the stdin option and some comments. You can view the script below or <a href="http://einaregilsson.com/download/suboffset.py">download the actual script here</a>.</p>
<pre class="brush: python; title: ; notranslate">
#!/usr/bin/python
&quot;&quot;&quot;
   Script to offset the time in subtitle files in the .srt format. Script
   takes in the filename and the offset (in milliseconds) to add or
   subtract from the subtitles. It then writes the new subtitles to the
   same file. Alternately you can specify the filename as '-' and then
   the script will read input from stdin and write output to stdout.

&quot;&quot;&quot;

__version__   = '1.0'
__author__    = 'Einar Egilsson'
__date__      = 'March 20th 2008'
__url__       = 'http://einaregilsson.com/2008/03/20/subtitle-fixer/' 

import sys, re, datetime

MILLISECOND = 1
SECOND = 1000 * MILLISECOND
MINUTE = 60 * SECOND
HOUR = 60 * MINUTE

def offset_time(time, offset):
    &quot;&quot;&quot; Takes in list with [hour, minute, second, millisecond] and returns
        it with offset milliseconds added and normalized
    &quot;&quot;&quot;
    ms = sum(map(int.__mul__,  time, [HOUR, MINUTE, SECOND, MILLISECOND]))
    ms += offset
    return [ms / HOUR, ms % HOUR / MINUTE, ms % MINUTE / SECOND, ms % SECOND]

def fix_subtitles(lines, offset, output):
    &quot;&quot;&quot; Takes in list (lines) with all the lines from the subtitle file, adds
        offset milliseconds to it and writes the file to output.
    &quot;&quot;&quot;
    for line in lines:
        pattern = r'(\d\d):(\d\d):(\d\d),(\d\d\d) --&gt; (\d\d):(\d\d):(\d\d),(\d\d\d)'
        match = re.match(pattern, line)
        if match:
            nrs = [int(nr) for nr in match.groups(0)]
            start = offset_time(nrs[:4], offset)
            end = offset_time(nrs[4:], offset)
            output.write('%02d:%02d:%02d,%03d' % tuple(start))
            output.write(' --&gt; ')
            output.write('%02d:%02d:%02d,%03d\n' % tuple(end))
        else:
            output.write(line)

def print_header():
    print 'Subtitle Fixer v%s' % __version__
    print 'Author: %s' % __author__
    print __url__
    print ''

if __name__ == '__main__':
    if len(sys.argv) != 3:
        print_header()
        print 'Usage: suboffset.py &lt;filename&gt; &lt;offset-in-milliseconds&gt;'
        print 'Use - for filename to read from stdin and print to stdout'
        sys.exit(1)

    offset = int(sys.argv[2])
    file = None
    if sys.argv[1] == '-': #Read from stdin and print to stdout
        fix_subtitles(sys.stdin.readlines(), offset, sys.stdout)
    else: #read from file and write to same file
        file = open(sys.argv[1], 'r')
        lines = file.readlines()
        file.close()
        file = open(sys.argv[1], 'w')
        fix_subtitles(lines, offset, file)
        file.close()
        print 'Finished adding %s milliseconds to %s' % (offset, sys.argv[1])
</pre>
]]></content:encoded>
			<wfw:commentRss>http://einaregilsson.com/subtitle-fixer/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

