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