Monday, 17 October 2011

Headaches and Compiling C++ .NET 3.5 projects under VS2010

 

Background:

One of our partners released some open source components in the form of C++ assemblies, which we consume in our product. I needed to recompile one of them today. By opening the VC++ project in Visual Studio 2010, they were automatically upgraded to .NET 4.0. This is no good, as our product is currently running 3.5 and subsequently wouldn’t load the compiled assemblies.

So, I needed to make the assemblies compiled under 3.5 within VS2010. Turns out this isn’t as obvious as I was expecting.

Solution:

1. Open the ‘*.vcxproj’ file within a text editor.

2. Find the section titled ‘<PropertyGroup Label="Globals">’ and add in the following line within it:

<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>

3. Open the solution within VS2010 and right click –> ‘Properties’ on the project.

4. Click on the ‘Common Properties’ section and verify that it says ‘Version=v3.5’

image

5. Click on the ‘Configuration Properties’ section and change the ‘Platform Toolset’ to ‘v90’ (.NET 2.0/3.0/3.5)

If you get any errors when you build, you may need to verify that the C++ components are installed as part of your VS2008 (yes – 2008) installation. You can verify this by opening up ‘Programs and Features’ in Control Panel and click ‘Repair’ while focused on the VS2008 Team entry in the list.

Headaches and Hacking C++ Strong Named DLLs

Background:

We had a problem with an hardware manufactures SDK, whereby one of their assemblies (for which we had the source code for) was throwing an unmanaged exception, killing our software.

I got in contact with their support, who provided us with some modified source code. After getting it compiling under C++ VS2010 / .NET 3.5 (another Headache in itself) I ran into problems with some of their other DLLs which are strongly signed refusing to load the assembly that we’ve recompiled. Guess what… we don’t have the strong key in order to resign the assemblies, and don’t have source code to all the other assemblies to recompile them without strong names!

That’s where Reflexil comes in!

Awesome little tool I found today, which allows you to hack around with compiled .NET assemblies.

1. Download and extract Reflexil anywhere you want.

2. Open Reflector, goto ‘View’ –> ‘Add-Ins’ –> ‘Add’ and select ‘Reflexil.Reflector.dll’

You now have it installed! Click on the ‘Reflexil’ item in the ‘Tools’ menu to load the right hand bar.

image

Using Reflexil you are able to remove the strong names from the DLLs that don’t belong to you, so that they will then load the ‘rogue’ DLL that I’ve just recompiled without the original strong name key file.

Click on the assemblies and remove the ‘HasPublicKey’ checkbox on each one. Clear the ‘PublicKey’ and ‘PublicKeyToken’

Note that if you have assemblies that reference each other, you will also have to go through each of the references for each assembly, and remove the public key information from each reference as well.