Assembly.LoadFrom-エビデンスのオーバーロードを使用して厳密な名前の署名を検証する
-
03-07-2019 - |
質問
Assembly.LoadFromオーバーロードとEvidenceパラメーターを使用して、アセンブリに厳密な名前を付けることはできますか?アセンブリ名、カルチャ、バージョン、および公開キートークンを指定できるようにします。この情報のいずれかが一致しない場合、アセンブリはロードに失敗します。
解決 3
これを行う別の方法を見つけました。
var assemblyName = new AssemblyName(<fully qualified type name>);
assemblyName.CodeBase = <path to assembly>
Assembly.Load(assemblyName);
他のヒント
アセンブリの公開キーは、ロード後に取得できます-正常にロードされ、公開キーがある場合は、厳密な名前が付けられます:
Assembly assembly = Assembly.LoadFrom (...);
byte[] pk = assembly.GetName().GetPublicKey();
さらに、アセンブリを公開する前にアセンブリの公開キーとバージョン情報を確認する :
AssemblyName an = AssemblyName.GetAssemblyName ("myfile.exe");
byte[] publicKey = an.GetPublicKey();
CultureInfo culture = an.CultureInfo;
Version version = an.Version;
GetPublicKey()がnull以外の値を返し、アセンブリが正常にロードされた場合、有効な厳密名を持ちます。
System.Windows.Forms.dllにパッチを適用するための厳密な名前の検証を破る方法があります。私がそれを使用している場合、あなたがそれについてできることはあまりありません。私のトリックには完全な信頼が必要です。
dllにパッチを適用し、パッチを適用したdllをデプロイし、ngenを適用し、元のイメージではなくパッチを適用したngenイメージを取得するようにローダーにパッチを適用しました。私ができたことは、ストックngened dllを上書きすることでした。 (私は実際にこのパスをテストし、他の誰かのソフトウェアを壊す可能性があると判断したのは悪い選択でした。)
これが良いアイデアだと言っているわけではありません。 Assembly.Loadからの署名の検証に依存するのは悪い考えだと言っています。
System.ReflectionAssemblyNameFlags 列挙型を試してください。
bool f_public_key = ((asm.GetName().Flags & AssemblyNameFlags.PublicKey) != 0);