2010-04-27 17 views
7

SQLite da PHX Software ha combinato un assembly gestito (System.Data.SQLite) con una dll non gestita (la DLL di SQLite a 32 o 64 bit) in un unico file e è riuscita a collegarli tra loro.Come si combinano una dll non gestita e un assembly gestito in un unico file?

Come posso fare? Devo incorporare l'assembly gestito nella DLL non gestita o viceversa?

ie. le mie domande sono:

  1. In quale ordine devo eseguire questa operazione?
  2. Quali strumenti o conoscenze ho bisogno per fare questo?
  3. In che modo (se diverso) collego le funzioni esportate dalla dll non gestita nel mio codice gestito?

Il motivo per cui lo chiedo è che voglio creare un wrapper zLib gestito. So che ci sono classi gestite in .NET ma dall'esperienza sono un po 'limitate (e un po' ossessionate dal fatto che non fanno il buffering appropriato), quindi mi piacerebbe creare la mia copia, anche perché voglio impara come fare questo

Così qualcuno sa cosa devo fare e come?

ho trovato il seguente:

ho intenzione di provare questo, ma tutte le ulteriori informazioni disponibili sarebbe bello pure.

+0

Pensateci due volte prima di fare questo, specialmente con i vostri gruppi di "core". Se questa non è la caratteristica essenziale del codice, è meglio rendere tali assiemi caricati dinamicamente.In altri casi, chiunque utilizzi tale assembly dovrà eseguire alcuni passaggi aggiuntivi per assicurarsi che utilizzi la versione corretta (x86 vs x64), anche se non ha utilizzato alcun codice non gestito. È ragionevole per te un esempio di 'System.Data.SQLite' (funzione essenziale) ma potrebbe non essere ragionevole nel tuo caso. – SergGr

risposta

0

Hai provato a eseguire reflector su System.Data.SQLite per vedere come lo fanno?

Mi immagino si potrebbe:

  • Includere le DLL 32 e 64 bit come risorse in un assembly gestito
  • Estrarre quella corretta in base bitness da qualche parte
  • chiamata SetDllDirectory() tramite PInvoke, se necessario, in modo che Windows possa trovare la dll estratto
  • un'istanza di una classe wrapper gestito a 32 o 64 bit, che ha riferimenti alla DLL

Tuttavia, poiché zlib è in C, è anche possibile racchiudere le chiamate necessarie in un assembly CLR implementato in C++ utilizzando il sorgente zlib. Ma non sono sicuro di come gestireste i testimoni in quel caso.

+0

questo è possibile e gestisce entrambi i casi a 32 e 64 bit. Questo non è come è fatto in sqlite però. – vidstige

0

cercare mergebin da sqlite dovrebbe essere quello che stai cercando.

può unire insieme sia gli assembly gestiti che quelli non gestiti.

MS sembra anche avere somthing da dire sul suo utilizzo here

+1

Il collegamento Microsoft è completamente irrilevante. – vidstige

Problemi correlati