Thursday, February 21, 2008

Installing WCF/WPF Extensions for VS 2005 after .NET Framework SP1

How to install WCF/WPF Extensions for Visual Studio 2005 if you've already installed .NET Framework 3.0 SP1?

If you have .NET Framework 3.0 SP1 installed on your machine, when attempting to install the Extensions - you'll get an error message saying:

Setup has detected that a prerequisite is missing. To use Visual Studio 2005 extensions for .NET Framework 3.0 (WCF & WPF), November 2006 CTP you must have the .NET Framework 3.0 runtime installed. Please install the .NET Framework 3.0 runtime and restart setup.

Now, apparently .NET Framework 3.0 SP1 is not .NET Framework 3.0 for the Extensions installer.

Seems like the best way to go around this problem is to fool the Extensions installer by putting a fake key into the registry:

"DisplayName"="Microsoft .NET Framework 3.0"


Worked for me! :)

see: Visual Studio 2005 WPF Extensions Problem

How to Control.Invoke an Anonymous Method?

Why won't Control.Invoke accept a delegate, even though it's looking for a Delegate?

This might seem like some semantic gymnastics... but when trying to compile this:

this.Invoke(delegate() { MessageBox.Show("Hello"); });

you'll get:

Argument '1': cannot convert from 'anonymous method' to 'System.Delegate'

which would suggest that a delegate is not a Delegate.

It's not exactly so - the problem is actually that the compiler does not know to what particular subtype of System.Delegate to cast/convert the anonymous method (delegate) to - and it can't create an instance of System.Delegate.

To make the code work, you have to explicitly create an instance of a particular type of a parameterless delegate returning void, e.g.:

this.Invoke(new MethodInvoker(delegate() {MessageBox.Show("Hello"); }));

see: Anonymous methods and Control.Invoke

Wednesday, February 13, 2008

XSD.exe and DebuggerStepThrough

Did you ever try to step into properties of classes generated by XSD.EXE when debugging? It doesn't work, does it? Not even on methods that you might have extended the XSD.EXE's partial classes with!

It is a common practice to generate partial classes from XSD schemas using XSD.EXE, and then extend some of them in another source file.

This all works nice and clean, but XSD.EXE is nasty and decorates all the classes it creates with the DebuggerStepThrough attribute.

That makes the debugger treat not only those parts of the classes that were created by XSD.EXE as 'nondebuggable'; you can't step into you own code (those methods in the class part authored by you), either!

Now, here are three ways to fix this:

  • run a search&replace and get rid of all the DebuggerStepThrough attributes
  • in Visual Studio, go to Tools/Options..., unfold the tree on the left-hand side of the dialog that will appear down to Debugging/General, and then uncheck the box next to 'Enable Just My Code'
    (Note that you will still have to set a breakpoint in the code marked as DebuggerStepThrough, otherwise the debugger will skip over it anyway)
  • stop using XSD.EXE :) (thanks to Marcin for this acute observation)

Well - the choice is yours :)

[see: Disable DebuggerStepThroughAttribute in code generated by xsd.exe?]


Tuesday, February 12, 2008

Convert an Array of Integers to an Array of Strings

This is just brilliant!

int[] ints = new int[] { 1, 2, 3, 4 };
string[] strings = Array.ConvertAll(ints, Convert.ToString);
see: Kieran Lynam's Blog

Check a String for Null or Empty

Yes, the method that .NET Framework 2.0 provides is the fastest.

You used to do it this way (I hope :):
if (s == null || s.Length == 0)

Checking the length is faster that comparing to "" or string.Empty, because the length is simply stored together with the string's content on the heap (see: Strings in .NET and C#, 'Memory usage').

.NET Framework 2.0 put the above check into a single static method of string:
if (string.IsNullOrEmpty(s))

For all the doubting Thomases ;) - this guy actually tested it:
String.Empty, null, Length, or String.IsEmptyOrNull

Tuesday, February 5, 2008

]]> Inside CDATA Section

Ever needed to put ]]> inside a CDATA section? Here's how.

Seems like there are two ways actually:

  • escape the '>' character as >
  • split the CDATA section into two sections:
    <![CDATA[A CDATA text with a ]]]]><![CDATA[> in it]]>


Cool! (It demanded a little more escaping from me to make the above look as it looks ;) )

Based on: How can I have ']]>' as a text inside CDATA in xml