2010-05-31 5 views
14

Fornirò un esempio di utilizzo di System.Data.SQLite.DLL che è un assembly misto con codice non gestito: Se eseguo questo:Come caricare dinamicamente gli assembly non elaborati che contengono codice non gestito? (Ignorando l'eccezione "Controllo criterio non verificabile non riuscito")

var assembly= Assembly.LoadFrom("System.Data.SQLite.DLL") 

Nessuna eccezione sono gettati, ma se faccio questo:

var rawAssembly = File.ReadAllBytes("System.Data.SQLite.DLL"); 
    var assembly = Assembly.Load(rawAssembly); 

Il CLR getta un FileLoadException con "codice non verificabile fallito controllo della politica (eccezione da HRESULT: 0x80131402).". Diciamo che sto provando a caricare questo assembly su un AppDomain figlio, come posso personalizzare la sicurezza di AppDomain per consentirmi di passare il controllo dei criteri?

+0

http://stackoverflow.com/a/24037103/1005741 Questo può aiutare qualcuno! – hriziya

risposta

13

Siamo vittima di un messaggio di eccezione scadente. Caricamento degli assembly con Assembly.Load (byte []) che contiene codice non gestito non supportato. Questo è l'argomento di questo feedback item.

UPDATE: l'elemento di feedback collegato è scomparso, eliminato come parte della pulizia al momento del rilascio di VS2012. L'unica parte di esso potrebbe ancora recuperare è questo frammento, copiato da un'altra pagina web:

“[...] abbiamo solo permettiamo immagini ILOnly da caricare [...] in quanto qualsiasi altra cosa non è sicuro” -

AGGIORNAMENTO: collegamento corretto con copia di backup archive.org.

+0

Puoi dare un esempio su come creare un oggetto evidence appropriato? –

+0

Hai provato a utilizzare AppDomain.Current.Evidence? –

+0

Non l'ho, ma non è solo una copia delle impostazioni di sicurezza del dominio corrente (quella che ha lanciato l'eccezione in primo luogo)? –

11

Il problema è che il CLR non esegue le normali fasi di caricamento della DLL, ad esempio il mapping delle sezioni separate delle DLL in pagine diverse, la correzione delle correzioni, ecc. Quando un assembly viene caricato da byte non elaborati, quei byte non elaborati vengono mappati in memoria così com'è, e vengono letti solo i meta-dati gestiti. Nessuna quantità di prove o impostazioni di sicurezza cambierà questo comportamento.

Problemi correlati