Come fare per caricare versioni diverse e compatibili tra loro della stessa dll statica?
Il costruttore dell'attributo DllImport va specificato a design time quindi non possiamo modificarlo durante l'esecuzione del programma.
Fortunatamente il CLR carica la Dll da disco solo se non gia' presente in memoria percio' se utilizziamo l'API LoadLibrary() possiamo decidere il percorso dove si trova la dll.

Esempio:

[DllImport("kernel32.dll")] static extern IntPtr LoadLibrary(string filename);
[DllImport("mydll.dll")] static extern bool MyMessageBeep(Int32 uType);

IntPtr i=IntPtr.Zero;
if (b)
{
IntPtr i=LoadLibrary("C:\\path1\\mydll.dll");
}
else
{
IntPtr i=LoadLibrary("C:\\path2\\mydll.dll");
}
MyMessageBeep(0x40);

In questo caso a seconda del flag b, la funzione MessageBeep verra' invocata da una diversa dll.