Prueba de interoperabilidad simple; Pila desequilibrada por una simple llamada

Actualmente estoy investigando un problema relacionado con la interoperabilidad y he escrito un pequeño programa de prueba para ayudarme a descubrir qué está sucediendo (el problema en cuestión implica una llamada a una función nativa más complicada y sería difícil publicarlo aquí) .

e todos modos, tengo un dll nativo muy simple que incluye solo el siguiente código:

extern "C" __declspec(dllexport) void Foo( int* arr, int size );

void Foo( int* arr, int size )
{
    for( int i = 0; i < size; ++i )
    {
        *arr++ = i;
    }
}

Estoy llamando a esta función desde C # así:

[DllImport("Interop.dll")]
public static extern void Foo( int[] arr, int size );

static void Main(...)
{
    Test();
}

private static void Test()
{
    int[] arr = new int[100];
    Foo( arr, arr.Length );
}

Al ejecutar "Prueba" recibo el siguiente error:

PInvokeStackImblanace fue detectado

Una llamada a la función PInvoke 'WindowsFormsApplication2! WindowsFormsApplication2.Form1 :: Foo' ha desequilibrado la pila. Esto es probable porque la firma PInvoke administrada no coincide con la firma de destino no administrada. Verifique que la convención de llamada y los parámetros de la firma PInvoke coincidan con la firma no administrada de destino.

Entonces, no soy un experto en interoperabilidad, pero no veo el problema con este código. La firma nativa espera un puntero a int, estoy pasando una referencia a unaint[]. Dicho esto, no funciona, así que debo estar equivocado sobre algo. Gracias por adelantado

EDIT: Ok, cambié a la prueba para ser lo más simple posible:

extern "C" __declspec(dllexport) void Foo( int i );

void Foo( int i ) { }

DO#

[DllImport("Interop.dll")]
public static extern void Foo( int i  );

private void Test()
{
    Foo( 1 );
}

Resultados en el mismo error. ¿Me perdí alguna lección integral sobre cómo llamar a las convenciones utilizadas en interoperabilidad? ¿Que esta pasando aqui

Respuestas a la pregunta(1)

Su respuesta a la pregunta