See the question and my original answer on StackOverflow

What I would do is this:

1) create an equivalent interface in C#, something like this:

[Guid("<the interface IID goes here>")]
public interface ISomeInterfaceName
{
   int Method1(...);
   int Method2(...);
   int Method3(...);
   ...
}

2) and then this, instead of your initial late-binding code:

Type type = Type.GetTypeFromProgID("DllName.COMName", "serverName", false);
var COMObject = Activator.CreateInstance(type);
var if = (ISomeInterfaceName)COMObject;
if.Method1(...);

NOTES: the IID must the IID from the interface, not to be confused with the CLSID. The methods should be laid out to correspond exactly to the COM ones (the methods order is important, how parameters and return type are defined is also important)

You could also import the TLB from the COM component, if you have a lot of classes and intefaces like this.