E' valsa la pena venire a lavorare oggi... ho finalmente risolto un problema che mi assillava da un pò!

Una dll esterna:

[DllImport("GeoSqlServer.dll", EntryPoint = "Area", SetLastError = true)]        
private static extern double AreaEx(IntPtr shape, uint shapeLength);

chiamata da codice .NET generico (console o winform) in questo modo funziona correttamente:

fixed (byte* pArray = &((byte[])shape)[0])
{
    
return AreaEx(pArray, (uint)shape.Length);
}

ma in codice CLR improtato in SqlServer 2005 il valore di ritorno è NaN!

Ho riscritto il codice della dll per ritornare void e prendere il valore di ritorno da un paramentro passato come puntatore:

[DllImport("GeoSqlServer.dll", EntryPoint = "Area2", SetLastError = true)]
unsafe private static extern double Area2Ex(byte* pArray, uint length, double* output);

e questo codice funziona perfettamente!

fixed (byte* pArray = &((byte[])shape)[0])
{
    
double output = 0;
    
double* pOutput = &output;
    Area2Ex(pArray, (
uint)shape.Length, pOutput);
    
return output;
}

Meglio così, no?

Prima o poi qualcuno, magari alla microsoft visto che ho postato la segnalazione, mi spiegherà il perchè dell'errore...

powered by IMHO