Managed C++, Interop and FILETIME
At home I do a lot of interop with the Win32 API. Over time after I saw myself writing the same interop code on several different projects so I started working on a centralized library for this type of code. Originally I wrote this library in C#. It was the language I used the most at the time and my brief experience with MC++ in Everret was too painful to justify using it.
Recently I've started interoping with much more advanced structures. I found that I was spending a lot of my time redefining structures, enums and defines that I am just using as a middle layer for the purpose of interop. Tracking down the value for every enum is tedious and very time consuming. This lead me to re-evaluate my choice of C# for the langauge since I could avoid this pain if I was using MC++.
A quick aside here. I am aware of several projects that exist where people have written scripts that will convert C++/C header files into their C# equivalent. I avoid these for style reasons. I find defines such as NERR_Sucess, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT unintuive. When I write my interop layer I write enums that convert these into "more useable" types like so
public enum class LogonProvider
{
Default = LOGON32_PROVIDER_DEFAULT,
...
};
I was aware that MC++ had a lot of changes in Whidbey so I decided to try it out. I must say that the new syntax for MC++ is a vast improvement over the original. As a result I fully switched my interop library over to MC++. After the initial learning period (< 1 week) I now find that I write my interop code much faster. Most of the time saved revolves around not having to look up the values for #defines, enums and such. This lets me fully devote my time to writing elegant wrappers for the Win32 API.
Thus far I have only run into one issue that is caused a bit of grief. The namespace System::Runtime::InteropServices defines a structure FILETIME. Unfortunately, a similar structure is included in a lot of Windows header files (eg Lm.h). So if you include one of those header files and that namespace you will get a compile error. There does not seem to be an easy way around this.
The best solution that I have found to this point is to typedef out all of the classes that I need from the namespace in stdafx.h like so
typedef System::Runtime::InteropServices::Marshal Marshal;
typedef System::Runtime::InteropServices::COMException COMException;
Overall I found the switch to MC++ for interop purposes in Whidbey to be a real time saver and I would recomend it to devs who write a lot of interop layer code