P / Richiamo dinamico di una DLL
Domanda
Qual è il modo migliore per P / Invocare dinamicamente codice non gestito da .NET?
Ad esempio, ho un numero di DLL non gestite con comuni esportazioni in stile C tra di loro. Vorrei prendere il percorso di una DLL e quindi P / Invoke una funzione basata sul nome esportato. Non conoscerei il nome DLL fino al runtime.
In sostanza, qual è l'equivalente di LoadLibrary
e GetProcAddress
per .NET? (Ho un codice esistente che utilizza queste funzioni per raggiungere lo stesso obiettivo, interamente in codice non gestito).
Soluzione
Questo articolo descrive un wrapper gestito typesafe per GetProcAddress che dovrebbe aiutarti.
http://blogs.msdn.com/ jmstall / archive / 2007/01/06 / Typesafe-GetProcAddress.aspx
Altri suggerimenti
Puoi farlo facendo P / Invocando LoadLibrary e GetProcAddress e quindi usando Marshal.GetDelegateForFunctionPointer .
Per i dettagli, consultare questo articolo .
Vedi anche questo post sul blog dal titolo Jonathan Swift che chiama dinamicamente una dll non gestita da .net
Un'opzione che hai è quella di creare una funzione nativa che è responsabile del caricamento della DLL e della funzione appropriate in memoria e quindi di restituire quella funzione al codice gestito in base al tuo percorso. In questo modo è possibile utilizzare il trucco GetProcAddress in modo naturale e restituire il punto funzione. È quindi possibile inserire PInvoke in questa funzione e recuperare un delegato che verrà quindi richiamato nella DLL corretta.