Tag Archives: C#

Getting Paths for Files in NUnit Tests

When using NUnit, sometimes you will want to access files in the test project. These might be xml files with data, assembly references or whatever. Now typically, NUnit will actually copy the files it thinks it needs into a temporary location. This causes the problem that you can then do things like use a relative path to get files in the project. You can use manifest resource streams but sometimes this just isn’t suitable.

To get the path of the root of your test project, you can use the snippet below. Make sure you call it in a unit test fixture that’s actually in your test project, not from a class referenced in another project!

This class, ‘TestHelper’ can be included in a Unit Test project to let you quickly get the path to the test project.

public static class TestHelper
{
    public static string GetTestsPath()
    {
        return Path.GetDirectoryName(Assembly.GetExecutingAssembly().CodeBase).Replace(@"file:\", string.Empty);
    }
}

Introducing FireKeys

I don’t know when I learnt that Windows + E opened up Windows Explorer. It must have been a while ago. But it’s imprinted in my muscle memory, the number of times I hit that combo every day is probably quite high. But how many other hotkeys do I use? Asides from a few other functional ones, like Win + D, I don’t use hotkeys so much. And I got to thinking, I’d love to open Google Chrome with a hotkey just like I do with explorer.

So I wrote FireKeys – a lightweight application that lets you assign hotkeys to actions. These actions could be opening program, a folder or a URL, but the underlying model is designed to be extensible.

FireKeysMain

You can get the tool from the FireKeys page. There’s an article on how it was developed on the CodeProject, FireKeys – Open Programs, Folders and URLs with Hot Keys.

Spider Solitaire and Augmented Reality

A while ago, I made an implementation of Solitaire and Spider Solitaire using WPF and my Apex MVVM library. I wrote about it on the CodeProject, in an article called Solitaire and Spider Solitaire for WPF (imaginative title indeed).

Anyway, just recently I got a very interesting message from rupam rupam, who has made an augmented reality version of the project! In his application, you use your webcam to play the game physically by picking up cards with gestures. Other gestures, like thumbs up and thumbs down are bound to commands in the game – here’s a screenshot:

SpiderAugmented

The project is called GesCard and as far as I know there isn’t a page showing the code – but there are more links on the YouTube video for the page. Check out the YouTube video with the link here https://www.youtube.com/watch?v=wCOjuPdBooI. Thanks to rupam for getting in touch and sharing this very cool code!

 

Creating Info Tip Handlers with .NET

I have just added an article to the CodeProject that discusses how to create Info Tip shell extensions in .NET. These extensions are used by the shell to customise the tooltips shown over shell items.

ShellInfoTipHandler

The article shows how you can use SharpShell to very quickly create these extensions, you can find it at: http://www.codeproject.com/Articles/527058/NET-Shell-Extensions-Shell-Info-Tip-Handlers.

So just how easy does SharpShell make creating Shell Info Tip Handlers? The answer is pretty easy indeed. The code below shows the full implementation of a Shell Info Tip Handler that changes the tooltips for folders to show the name of the folder and the number of items it contains:

/// <summary>
/// The FolderInfoTip handler is an example SharpInfoTipHandler that provides an info tip
/// for folders that shows the number of items in the folder.
/// </summary>
[ComVisible(true)]
[COMServerAssociation(AssociationType.Directory)]
public class FolderInfoTipHandler : SharpInfoTipHandler
{
    /// <summary>
    /// Gets info for the selected item (SelectedItemPath).
    /// </summary>
    /// <param name="infoType">Type of info to return.</param>
    /// <param name="singleLine">if set to <c>true</c>, put the info in a single line.</param>
    /// <returns>
    /// Specified info for the selected file.
    /// </returns>
    protected override string GetInfo(RequestedInfoType infoType, bool singleLine)
    {
        //  Switch on the tip of info we need to provide.
        switch (infoType)
        {
            case RequestedInfoType.InfoTip:
 
                //  Format the formatted info tip.
                return string.Format(singleLine
                                       ? "{0} - {1} Items"
                                       : "{0}" + Environment.NewLine + "Contains {1} Items",
                                       Path.GetFileName(SelectedItemPath), Directory.GetFiles(SelectedItemPath).Length);
 
            case RequestedInfoType.Name:
                
                //  Return the name of the folder.
                return string.Format("Folder '{0}'", Path.GetFileName(SelectedItemPath));
                
            default:
 
                //  We won't be asked for anything else, like shortcut paths, for folders, so we 
                //  can return an empty string in the default case.
                return string.Empty;
        }
    }
} 

As you can see, all of the COM interfaces are hidden away and handled for you, there is no ugly pinvoke code and no use of strange structures imported from Win32. SharpShell handles all of the plumbing for you.

SharpShell

SharpShell is a project that I have recently uploaded to CodePlex. This class library, and set of tools and samples, is designed to be a framework to enable rapid development of Shell Extensions using the .NET Framework. In time it may grow to contain some functionality for using Shell entities within managed applications (for example, allowing an Explorer context menu to be built dynamically for a given path).

Anyway, the code is all at sharpshell.codeplex.com. You can also see a nice article on the CodeProject that show’s how to create a Shell Context Menu Extension using C#, the article is at: .NET Shell Extensions – Shell Context Menus.

Screenshot1_ExampleIconHandler

Above: An example of a Managed Shell Extension. This sample colours the icons for dlls differently, depending on whether they are native dlls or assemblies.

So far, in the repo on CodePlex there are also samples for Shell Icon Handlers (which customise icons in Explorer) and Shell Info Tip Handlers (which customise tooltips). Both of these extension types are fully supported in the current dev version and will be released in the next few days. There’s also a partially functioning Shell Property Sheet implementation which will be delivered in the subsequent version. The Shell Property Sheet introduces some particularly strange code – 32 and 64 bit C++ dlls are embedded as manifest resource streams and extracted as needed to provide access to C++ function pointers – ouch.

More to follow – check out the project and the article.

The GAC Manager

I have started a new project on CodePlex called ‘GAC Manager’. This is a project that is in two parts, the first is a simple tool to allow users to manipulate their local global assembly cache, the second is an API that provides the core functionality.

Here’s a screenshot of the tool in its current state:

An article on the project is available on the CodeProject at: http://www.codeproject.com/Articles/430568/A-GAC-Manager-Utility-and-API

The project itself is at: https://gacmanager.codeplex.com/

As always, comments, feature requests and so on are welcome!

Come on MS – Improve MFC

Loads of developers still use MFC. OK – if you’re writing a new project, MFC would not be a great choice. But what if you’re maintaining a 1.5 million line MFC app? 

MFC support in Visual Studio has barely improved since VC++ 6.0 – in fact its got worse. Their cursory attempt to show an effort by adding support for the Ribbon Control with the MFC feature pack was not enough. Why can we still not properly use tab controls in the dialog editor?

Those who use MFC are probably supporting big enterprise applications – for a long time now we’ve been neglected. Please vote for more MFC support in Visual Studio Uservoice below:

http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/2782934-improve-mfc

Will they listen? Chances are not – unless lots of people vote. But I’d really like to see some effort on this, it’s a technology still used by many.

It would be interesting to see a survey of enterprise applications – and what they’re written in. It’d be interesting to then compare this to how well MS support that platform. MS will put lots of efforts into what they think that developers should be using – but how well are they supporting their real customers who are creating real products?

Could not load file or assembly ‘System.Windows, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e’ or one of its dependencies.

Are you getting the error below when working with Silverlight projects?

Could not load file or assembly 'System.Windows, Version=2.0.5.0, 
Culture=neutral, PublicKeyToken=7cec85d7bea7798e' or
one of its dependencies.

It’s a bit of an odd one. The solution that works for me is to re-register System.Core and System.Windows in the GAC. Use the commands below.

32 Bit System

“C:\Program Files\Microsoft SDKs\Windows\v7.0A\bin\NETFX 4.0 Tools\gacutil” /i “C:\Program Files\Microsoft Silverlight\4.1.10111.0\System.Core.dll”
“C:\Program Files\Microsoft SDKs\Windows\v7.0A\bin\NETFX 4.0 Tools\gacutil” /i “C:\Program Files\Microsoft Silverlight\4.1.10111.0\System.Windows.dll”  

64 Bit System

“C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin\NETFX 4.0 Tools\gacutil” /i “C:\Program Files\Microsoft Silverlight\4.1.10111.0\System.Core.dll”
“C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin\NETFX 4.0 Tools\gacutil” /i “C:\Program Files\Microsoft Silverlight\4.1.10111.0\System.Windows.dll”  

So far I am yet to understand why this happens – if anyone can shed any light please comment!