Interfaces "Flattened" during COM Export

While researching a question someone asked, I discovered that TLBEXP will "flatten" out your .NET interface hierarchy.

Assume you have a simple .NET interface such as:

public interface IFoo
{
	void Method1_v1();
	void Method2_v1();
}

When exported to COM, the interface in OLEVIEW looks something like this (only relevant portions shown here):

interface IFoo : IDispatch {
	HRESULT Method1_v1();
	HRESULT Method2_v1();
};

Later, you want to add more functionality so you define a new interface that inherits from the previous one:

public interface IFoo2 : IFoo
{
	void Method1_v2();
}

When exported to COM, your two interfaces now appear as:

interface IFoo : IDispatch {
	HRESULT Method1_v1();
	HRESULT Method2_v1();
};

interface IFoo2 : IDispatch {
	HRESULT Method1_v2();
};

You've lost your interface hierarchy. This is a "by design" issue as documented in MSDN:

All exported interfaces extend directly from either IUnknown or IDispatch, regardless of their inheritance hierarchy in managed code.

No Comments