Come faccio a caricare dinamicamente assemblee prime che contiene il codice non gestito? (Bypassando 'il codice di controllo fallita politica Unverifiable' eccezione)
-
05-10-2019 - |
Domanda
ho intenzione di dare un esempio di utilizzo System.Data.SQLite.DLL che è un misto montaggio con codice non gestito: Se eseguo questo:
var assembly= Assembly.LoadFrom("System.Data.SQLite.DLL")
Non ci sono eccezioni sono gettati, ma se faccio questo:
var rawAssembly = File.ReadAllBytes("System.Data.SQLite.DLL");
var assembly = Assembly.Load(rawAssembly);
Il CLR lancia un FileLoadException su "Vedi codice di politica fallimentare Unverifiable (eccezione da HRESULT: 0x80131402).". Diciamo che sto cercando di caricare questa assemblea su un bambino AppDomain, come posso personalizzare la sicurezza del dominio di applicazione per permettere a me passare il controllo della politica?
Soluzione
Siamo vittima di un messaggio di eccezione scadente. Caricamento assiemi con Assembly.Load (byte []) contenenti codice non gestito non è supportato. Questo è l'oggetto di questo elemento positivo .
UPDATE: la voce di feedback collegato è andato, cancellato come parte della pulizia in VS2012 tempo di rilascio. L'unica parte di esso potrebbe ancora recuperare è questo frammento, copiato da un'altra pagina web:
“[...] ci consentono solo le immagini ILOnly da caricare [...] in quanto qualsiasi altra cosa non è sicuro” -
UPDATE:. Collegamento fisso con archive.org copia di backup
Altri suggerimenti
Il problema è che il CLR non esegue le normali fasi di carico DLL - come mappatura delle DLL sezioni separate in pagine diverse, regolando correzioni, ecc Quando un assembly viene caricato dal byte grezzi, quei byte grezzi vengono mappati in memoria, come è, e solo gestito meta-dati vengono letti. Nessuna quantità di impostazioni prove o di sicurezza cambierà questo comportamento.