Questa è la chiamata ad una funzione c esterna:

[DllImport("GeoSqlServer.dll", CharSet = CharSet.Auto, EntryPoint = "Area")]
public static extern double AreaEx(IntPtr pArray, uint length);

 

Questo è il codice in una winform:

// Connessione al server SqlServer2005
string connString = "Data Source=PLUTONE\\SQLEXPRESS; Integrated Security=SSPI;" + "Initial Catalog=GeoSampleData";
SqlConnection conn = 
new SqlConnection(connString);

// Query di selezione di un poligono
string query = "SELECT SHAPE FROM dbo.Polygon WHERE OBJECTID = " + ObjectIDTextBox.Text;
SqlCommand command = 
new SqlCommand(query);
command.Connection = conn;

// Richiesta del dato binario
conn.Open();
byte[] shape = (byte[])command.ExecuteScalar();
conn.Close();

// Chiamata a dll esterna con pinvoke
GCHandle pinnedArray = GCHandle.Alloc(shape, GCHandleType.Pinned);
IntPtr pArray = pinnedArray.AddrOfPinnedObject();

// Mostro il risultato in una textbox
ResultsTextBox.Text = (Form1.AreaEx(pArray, (uint)shape.Length)).ToString();

// Libero le risorse
pinnedArray.Free();

La dll è presente nel path dell'applicazione e tutto funziona perfettamente e il valore di ritorno è un double corretto.

 

Ma se inserisco la dll nella dir \binn di SqlServer2005 (dove il server va a cercare le dll di cui abbisogna) il valore di ritorno è:

"Non un numero reale"   (per inciso questo sarebbe il ToString() del valore di ritorno, c# non ha qualcosa tipo NaN o altro?)

 

Questo è il codice SQL2005:

// Chiamata a dll 
GCHandle pinnedArray = GCHandle.Alloc((byte[])shape, GCHandleType.Pinned);

IntPtr pArray = pinnedArray.AddrOfPinnedObject();

double temp = GeometryCommands.Sample1Ex();

if (temp.ToString() == "Non un numero reale") return ShapefileSupport.NULLVALUE;
else return temp;

Ometto il codice T_SQL per la selezione dei poligoni da passare alla funzione per il calcolo dell'area, ma sono sicuro che quella parte di codice funziona, avendola testata innumerevoli volte con funzioni CLR (non esterne).

 

Al momento sto cercando di capire perchè il pinvoke non mi funziona da SqlServer 2005...

 

powered by IMHO