管理されていないコードを含む生のアセンブリを動的にロードするにはどうすればよいですか?
-
05-10-2019 - |
質問
使用の例を挙げます System.data.sqlite.dll これは、管理されていないコードを使用した混合アセンブリです:これを実行する場合:
var assembly= Assembly.LoadFrom("System.Data.SQLite.DLL")
例外はありませんが、私がこれを行う場合:
var rawAssembly = File.ReadAllBytes("System.Data.SQLite.DLL");
var assembly = Assembly.Load(rawAssembly);
CLRは、「検証不可能なコードに失敗したポリシーチェック(hresult:0x80131402からの例外)」を使用して、フィルロデックスをスローします。このアセンブリをChild AppDomainにロードしようとしているとしましょう。AppDomainのセキュリティをカスタマイズして、ポリシーチェックに合格できるようにするにはどうすればよいですか?
解決
私たちは不器用な例外メッセージの犠牲者です。アセンブリをAssembly.load(byte [])にロードすることは、管理されていないコードを含むことはサポートされていません。これがこれの主題です フィードバックアイテム.
更新:リンクされたフィードバックアイテムは、VS2012リリース時間でのクリーンアップの一部として削除されました。それの唯一の部分は、まだ回復することができるのは、別のWebページからコピーされたこのフラグメントです。
「[…]他のものは安全ではないので、ilonly画像をロードすることのみを許可します」 -
更新:archive.orgバックアップコピーに固定されたリンク。
他のヒント
問題は、CLRが通常のDLL読み込み手順を実行しないことです - DLLを別のページに個別にマッピングする、修正を調整するなど。アセンブリが生のバイトからロードされると、それらの生のバイトがメモリにマッピングされ、管理されたメタデータのみが読み取られます。この動作を変更する証拠やセキュリティ設定はありません。