Setting a culture for all threads in an application

If you do any kind of globalisation in your applications, you will probably already be familiar with the Thread.CurrentCulture and Thread.CurrentUICulture properties that can be used to set a culture on the thread so that .Net knows to load the correct resources and to format numbers and dates properly.

A big downside to using approach this is that the culture is only set on the current thread, meaning that any new threads created will be using the default culture for the application (which is tied to the regional settings of the operation system). This wasn’t too much of a problem years ago when multi-threading was not used widely, but in modern application development it is virtually impossible to avoid using multiple threads (e.g. Task Parallel Library), especially when trying to make use of modern multi-core hardware. You would have to manually set the culture when spawning new threads to ensure that the correct culture was being used - a real pain and a common cause of bugs.

.Net 4.5 comes to the rescue with the introduction of two new properties:


A culture can be set using properties that will then be used for all threads in the whole application domain, meaning that you can set the correct culture at application start up and all threads will use that culture. By default, these properties are set to null meaning that the pre-4.5 behaviour will still hold and that the system culture will be used by default.

The MSDN docs for CultureInfo.DefaultThreadCurrentCulture and CultureInfo.DefaultThreadCurrentUICulture provide more details.

Alternatives to .Net Reflector

RedGate recently announced that from the next version of Reflector (v7), they will charge $35 for a licence. Since the announcement a few weeks ago, there has been quite a backlash against the decision from the .Net community, mainly because RedGate have put a time-bomb in the currently-free version so that it will expire at the end of May 2011. In response to this announcement, several alternatives to Reflector have surfaced - some free, some commercial. The list below outlines all of the alternatives, some of which have been around for many years.

  • JetBrains ReSharper (commercial + free)
    Within a day of the announcement, JetBrains put out a teaser suggesting that a decompiler was in the works. Two weeks later, they announced that the next version of ReSharper will have an integrated decompiler akin to reflector, along with a free standalone version to be released later in the year.

  • Telerik JustCode (commercial)
    Just as JetBrains put out a teaser, Telerik followed suit and showed a decompilation feature that will be in the next version of their JustCode tool.

  • ldasm (free)
    This tool comes bundled with the Windows SDK Tools (that get installed as part of Visual Studio). It is purely an IL disassembler, and so cannot decompile to C#.

  • ILSpy (free)
    The team behind SharpDevelop have been working hard on ILSpy and have already released a major milestone of v1 of their decompiler. It can decompile to C#.

  • Cecil Studio (free)
    This is a Windows forms UI based on the Mono Cecil library. It has already been around for a few years.

  • MonoReflector (free)
    This is a WPF UI based on the Mono Cecil library.

  • MonoDevelop Assembly Browser (free)
    Released for the first time in version 2.0 of MonoDevelop (currently at v2.4.2).

  • Salamander .Net Decompiler (commercial)
    This is part of a larger tool called .Net Explorer.

  • Dis# (commercial)
    This tool has been around for a while, but is not often mentioned. It is not as polished as Reflector and does not support never versions of .Net, but has some nice features not seen anywhere else. Once such feature is to rename the decompiled variables within the tool to give them a more meaningful name.

  • Spices .Net Decompiler (commercial)
    As well as decompiling to IL, C#, J#, C++ and Delphi.Net, this tool has a feature to build code flow diagrams from the decompiled source to show the execution flow.

  • Decompiler.NET (commercial)
    This is s decompiler combined with an obfuscator, language translator and refactoring tool that integrates with Visual Studio.

  • Keep Decompiling Free
    This website popped up recently with nothing more than a teaser to get more information when it is available.

  • RedGate Reflector (commercial)
    Of course, there is still the current king of them all, albeit in a now charged-for format. Still well worth the $35.

Which of these will turn out to be the best/most successful to take Reflector’s throne is yet to play out, but there seems to be a healthy interest from both the community and commercial aspects in making a replacement.

F# links

I am currently learning F# and am starting to amass a selection of useful links. I though it would be handy to collate them all in the one place:


C# and F# Equivalents

General F#

Temporarily disabling ReSharper

I have ReSharper installed and think it is a great tool for productivity, but occasionally I find it useful to temporarily disable it to speed up Visual Studio (especially so on my old, slow laptop). This is achieved in two different ways, depending on the version of ReSharper.

In versions prior to version 5, ReSharper appears in the Add-in Manager dialog, accessed via the Tools menu. Using this dialog, you can uncheck the ReSharper add-in which will suspend it (the menu will still be visible, but its functionality will be disabled).

Add-in manager

Checking it again will re-enable it. Both of these actions can be performed without restarting Visual Studio.

In version 5, ReSharper no longer appears in the add-ins dialog. At first glance, I though the ability to disable ReSharper was no longer available. As it turns out, it is now part of ReSharper itself and is accessed via the Tools -> Options -> ReSharper -> General dialog. Clicking the suspend button will suspend ReSharper and disable its functionality. Once suspended, clicking the resume button will re-enable it.

ReSharper options

This applies to all versions of Visual Studio - the difference is based on the version of ReSharper only.

Extracting MSI files (revisited)

A few years ago, I posted about how to extract the contents of an MSI file without having to go through the process of installing it. The tool used to do this was called Less MSIerables. This tool does do the job, but the UI is a bit clunky to use, it has a few bugs, and occasionally fails to extract the contents of a file. On top of this, it looks like this tool is not actively developed (it was last updated in 2005), so I recently started to look for an alternative.

It turns out that Microsoft provide this functionality as part of MSIExec that comes as part of the Windows installer. To extract the contents of any MSI file, simply run the following:

msiexec.exe /a installer.msi /qb TARGETDIR=C:\temp

This will extract the complete contents of the MSI file to the specified directory.

MSDN lightweight view

Following on from my last post on the MDSN Low Bandwidth View, Scott Hanselman recently tweeted about the beta version of MDSN Lightweight View.

In a similar way to adding (loband) before the .aspx part of the url, putting (lightweight) before the .aspx part of the url will use the new lightweight view of MSDN, meaning a much neater and streamlined version.

In addition, Scott has previously posted about the other modes of MSDN:

Mode Description Example
- The normal MSDN view Example
(loband) A minimal view, focussed on speed Example
(lightweight) A faster lightweight view, including quick links to switch between languages and .Net framework versions Example
(pda) Aimed at PDAs and phones. Turns off the tree and allows a 100% width Example
(robot) Optimised for search engines Example
(printer) A printable version Example
(ide) Used when viewing inside the IDE. Adds send and give feedback links Example

Note that the dev10ide view Scott mentions seems to have been removed, and that the lightweight view is currently in beta, so may be liable to change.

MSDN low bandwidth view

Several months ago, I read a tip about passing an extra parameter on the url to MSDN documentation to put it into “low bandwidth” mode. I remember doing it at the time, but almost immediately forgot the url switch. That was until last week when I read Eric Nelson’s post on how to do it.

The trick is to put (loband) before the .aspx part of the url. For example, the low bandwidth version of


Once you have accessed it, you can persist it by clicking on the “Persist low bandwidth view” link.

Since Eric wrote his post, it seems that a “Switch on low bandwidth view” link has been added into the normal MSDN pages to enable it to be switched on without hacking around with the url.

Jon Galloway has a post that summarises the benefits of the low bandwidth view. For me, the biggest benefit is the speed of loading, since the page doesn’t run lots of JavaScript to sync the contents tree to the currently displayed article.

SQL Server SP3 released

Service pack 3 for SQL Server 2005 was released last week. In it, they have fixed a curious bug that I reported back in January.

The bug occurs when trying to delete rows from a table that has a NULL value for an image column. This works fine normally, but if there is a foreign key referencing the table (to any of its columns), any rows that have had their image column updated to be NULL fail to be deleted. This SQL demonstrates the problem:

-- create two linked tables
CREATE TABLE [dbo].[TableA]
    [Identity] [int] NOT NULL IDENTITY(1, 1) PRIMARY KEY,
    [TableB_Identity] [int] NULL

CREATE TABLE [dbo].[TableB]
    [Identity] [int] NOT NULL IDENTITY(1, 1) PRIMARY KEY,
    [DATA] image NULL

    FOREIGN KEY ([TableB_Identity]) REFERENCES [TableB] ([Identity])

-- insert some data

-- this delete works successfully
SELECT COUNT(*) AS Remaining_Count_Should_Be_0 FROM [TableB]

-- insert some data

-- update the data to be have a NULL value

-- this delete doesn't work
SELECT COUNT(*) AS Remaining_Count_Should_Be_0 FROM [TableB]

-- this delete doesn't work
SELECT COUNT(*) AS Remaining_Count_Should_Be_0 FROM [TableB]

-- this delete does work successfully
        SELECT * FROM [TableB] AS TB
        AND TB.[Identity] = [TableB].[Identity]
SELECT COUNT(*) AS Remaining_Count_Should_Be_0 FROM [TableB]

Not all of the delete queries work correctly. The output of the script is four result sets with the count of how many rows are in the table at each point. All of them should be 0 (as is the case on SQL Server 2000), but in SQL Server 2005 without SP3 they are actually 0, 3, 3 and 0.

The simple delete query:


does not delete any rows after the values for the Data column have been updated to NULL, even though a similar select query:


Notably, if either the foreign key is removed, or the:


query is not performed, the script behaves as expected. Additionally, using text or ntext instead of image does not work as well, but using the new varchar(max), nvarchar(max) or varbinary(max) data types does work.

Apparrently, the distinction between NULL values stored as a result of an insert or an update has precendece in the WRITETEXT command:

If the table does not have in row text, SQL Server saves space by not initializing text columns when explicit or implicit null values are added in text columns with INSERT, and no text pointer can be obtained for such nulls. To initialize text columns to NULL, use the UPDATE statement. If the table has in row text, you do not have to initialize the text column for nulls and you can always get a text pointer.

This points to the “text in row” option having a bearing on this behaviour. Indeed, altering this option after creating the tables:

sp_tableoption N'TableB', 'text in row', 'ON'

results in the script working as expected. Useful as a potential workaround.

The bug is present in all versions of SQL Server 2005, but not in SQL Server 2000 or 2008.

A full list of what’s changed in SP3 can be found here, with a full list of the bugs fixed here.

Useful diagnostics tools

I recently visited a customer site to diagnose some problems with an application deployed on a server. Because I was effectively “visiting blind” in not knowing what was wrong or even if I would have internet access, I had to pre-empt any potential problems and take whatever tools I would need to diagnose them with me.

The following is a list of the tools I took:

  • Active Ports
    This is an equivalent to running netstat -nabv 5 from the command line, but wraps a nice GUI around it with the ability to look up the host names for connected IP addresses.

  • BareTail
    This is a simple log file viewer that can “tail” a running log and apply highlighting based on custom searches.

  • CorFlags
    This is a tool that comes as part of the Visual Studio SDK and enables a .Net application to be forced to run as 32-bit on 64-bit hardware. Existing applications can be tweaked without re-compilation.

  • Culture Launcher
    This is one of my own tools that can launch an .Net application using a different culture/language. The culture and UI culture can be set independently of each other.

  • Error Lookup
    This is a small tool that comes with Visual Studio (when you install the C++ components). It enables Win32 error codes to be translated into “meaningful” English error messages.

  • Managed Stack Explorer
    This is a tool that can preiodically capture stack traces from running .Net applications. It also shows a variety of information about the managed processes and threads running on a machine.

  • Red Gate Diagnostics Tool
    This is a tool from Red Gate that collects lots of system information from a computer. It is very useful because of the amount of data that it collects all in one place.

  • Snippet Compiler
    This is like a cut-down version of Visual Studio. It has an IDE-like editor (with only basic intellisense) and can compile and run .Net applications. The biggest plus is that it requires no installation.

  • SpaceMonger
    This is a tool that gives a visual representation of disk usage for a whole drive. This version is an older version of the tool, but is the last version that is free.

  • SysInternals
    This is the famous SysInternals Suite of tools, now owned by Microsoft, but still occasionally updated with new features and bug fixes. This contains lots of file, disk, network, process, registry and system utilities.

This toolset (along with a few custom-written SQL scripts) provided me with everything I needed to collect all the information I needed to get to the bottom of the problems.

Setting a proxy server for Windows updates on Windows Vista

I’ve recently been trying to get automatic Windows updates working on Vista. Every time it tried to fetch the updates, it reported an error code of 80070057. After getting more detailed information from the WindowsUpdate.log in the Windows directory, the problem turned out to be the proxy server in our office. Whilst my user profile has the correct proxy server settings, the Background Intelligent Transfer Service (BITS) that is used to download Windows updates doesn’t. The solution is to set the proxy server for the system.

To see the current proxy settings, run from the command line:

netsh winhttp show proxy

If it says “direct”, there are no proxy settings and Windows update probably will not work.

To set the proxy settings, run from the command line (you will probably need to run this with administrative permissions):

netsh winhttp set proxy proxy-server="yourproxy:port" bypass-list="<local>"

This will set the proxy server on the system to allow the BITS service to connect to the Windows updates servers.