2011-12-15 11 views
5

Ho una vasta libreria di funzioni C/C++, che deve essere chiamata da SQL Server 2008. Ho scritto una classe di adattatore C# che carica queste funzioni da Win32 DLL con DllImport e li espone al codice .Net. Funziona perfettamente nella maggior parte delle applicazioni .Net.
Ora, stavo cercando di utilizzare la stessa tecnica con SQL Server CLR. Creo un set di funzioni CLR e stored procedure, che chiamano la classe dell'adattatore. Ciò non funziona come un tentativo di caricare i risultati DLL non gestiti in System.BadImageFormatException.
È possibile eseguire questa operazione con stored procedure estese, ma tale metodo è deprecato e potrebbe essere sospeso in qualsiasi nuova versione di SQL Server.
Quale sarebbe il modo corretto di chiamare le funzioni non gestite dalla procedura memorizzata CLR? La mia ipotesi è che questo dovrebbe essere fatto fuori processo.Chiamare le funzioni DLL C/C++ non gestite da SQL Server 2008


che sto cercando di fare il mio proc chiamata di stored un servizio Web che espone queste funzioni. Sembra una buona idea, ma finora ho un problema nel distribuire l'assembly SQLCLR che effettua chiamate al servizio Web. Non riesco a caricare l'assemblaggio System.ServiceModel.dllversion=3.0.0.0, che dipende dalla versione di assemblaggio System.Web.dll2.0.0.0.

Caricamento System.Web assemblea mi dà il seguente errore:

Assembly 'System.Web' references assembly 'system.web, version=2.0.0.0, culture=neutral, publickeytoken=b03f5f7f11d50a3a.', which is not present in the current database. SQL Server attempted to locate and automatically load the referenced assembly from the same location where referring assembly came from, but that operation has failed (reason: version, culture or public key mismatch). Please load the referenced assembly into the current database and retry your request.

ho trovato la soluzione per il problema della distribuzione System.Web assemblaggio. Invece di distribuirlo da C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Web.dll, dovrebbe essere distribuito da C:\Windows\Microsoft.NET\Framework64\v2.0.50727\System.Web.dll. Quindi vengono implementati anche tutti gli altri assembly richiesti.

L'elenco dei gruppi in ordine di schieramento:

  • C: \ Windows \ Microsoft.NET \ Framework \ v3.0 \ Windows Communication Foundation \ SMdiagnostics.dll
  • C: \ Windows \ Microsoft.NET \ Framework64 \ v2.0.50727 \ System.Web.dll
  • C: \ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ System.Messaging.dll
  • C: \ Programmi \ Assiemi di riferimento \ Microsoft \ Framework \ v3.0 \ System.IdentityModel.dll
  • C: \ Programmi \ Assiemi di riferimento \ Microsoft \ Framework \ v3.0 \ System.IdentityModel.Selectors.dll
  • C: \ Windows \ Microsoft.NET \ Framework \ v3.0 \ Windows Communication Foundation \ Microsoft.Transactions .Bridge.dll
+0

Si sta tentando di caricare una DLL non gestita a 32 bit in un server a 64 bit? – GSerg

+0

Come riferimento a lato, [questo può essere fatto out-of-process] (http://stackoverflow.com/questions/752357/sql-server-2008-how-crash-safe-is-a-clr-stored- procedure-that-loads-unmanaged-l), ma sono sicuro che non è un requisito. – GSerg

+0

Beh, ho bisogno di farlo in ogni modo possibile. Sì, a 32 bit non gestito, credo che il server sia a 32 bit, ma su sistema operativo a 64 bit. Ho visto quel post. Stanno usando le stored procedure estese, che sono deprecate. – Ramzay

risposta

1

Interessante discussione qui: MSDN - Unmanaged code in SQL CLR. Sospetto che sia dovuto al modo in cui le DLL vengono caricate dal motore. Presentano una serie di opzioni tra cui l'hosting del codice al di fuori del server SQL in un altro servizio e l'accesso al codice tramite WCF o forse COM. L'opzione finale consiste forse nel ricompilare il codice in C++ gestito puro, ma questa potrebbe non essere un'opzione per il codice legacy.

Understanding CLR Integration in SQL Server 2005 presenta ulteriori informazioni su come funziona il processo.

To further restrict the code that is allowed to exist and execute inside SQL Server each assembly must be registered with a set of permissions. Three pre-defined sets are available to use; SAFE, EXTERNAL_ACCESS and UNSAFE ...

Si dovrebbe anche rivedere CLR Integration Security, e detemrine i livelli di attendibilità hanno bisogno per il codice che sta eseguendo e se si sarà in grado di accedere all'uso del codice all'interno del processo CLR comunque.

+0

Grazie. Questo è interessante, ma in realtà non offre una soluzione. – Ramzay