Comment charger dynamicment des assemblys bruts contenant du code non géré? (En contournant l’exception “Contrôle de stratégie ayant échoué du code non vérifiable”)

Je vais donner un exemple d’utilisation de System.Data.SQLite.DLL, qui est un assemblage mixte avec du code non managé: Si j’exécute ceci:

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

Aucune exception n’est levée, mais si je fais ceci:

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

Le CLR lève une exception FileLoadException avec “vérification de stratégie ayant échoué pour le code non vérifiable. (Exception de HRESULT: 0x80131402)”. Supposons que j’essaye de charger cet assembly sur un AppDomain enfant. Comment puis-je personnaliser la sécurité de l’AppDomain pour me permettre de passer le contrôle de stratégie?

Nous sums la victime d’un message d’exception minable. Le chargement d’assemblys avec Assembly.Load (byte []) contenant du code non géré n’est pas pris en charge. C’est l’object de cet article de feedback .

UPDATE: l’élément de commentaire lié est parti, supprimé dans le cadre du nettoyage au moment de la publication de VS2012. La seule partie de celle-ci pouvant encore être récupérée est ce fragment, copié depuis une autre page Web:

“[…] Nous ne permettons que de charger des images Bnly […] car tout le rest n’est pas sans danger” –

UPDATE: lien corrigé avec la copie de sauvegarde archive.org.

Le problème est que le CLR n’effectue pas les étapes normales de chargement de la DLL – telles que le mappage des sections séparées de la DLL dans différentes pages, l’ajustement de corrections, etc. Lorsqu’un assemblage est chargé à partir d’octets bruts, ces octets bruts sont mappés en mémoire tels quels, et seules les métadonnées gérées sont lues. Aucune quantité d’éléments de preuve ou de parameters de sécurité ne modifiera ce comportement.