System.Security.Policy.Hash can calculate the hash regardless of the place of assembly. Thus, we have at least 2 ways to get the assembly as a byte array:
1) Using reflection:
var hash = new Hash(assembly); var dllAsArray = (byte[]) hash.GetType() .GetMethod("GetRawData", BindingFlags.Instance | BindingFlags.NonPublic) .Invoke(hash, new object[0]);
2) Using a false implementation of HashAlgorithm:
public class GetWholeBodyPseudoHash : HashAlgorithm { protected override void Dispose(bool disposing) { if(disposing) _memoryStream.Dispose(); base.Dispose(disposing); } static GetWholeBodyPseudoHash() { CryptoConfig.AddAlgorithm(typeof(GetWholeBodyPseudoHash), typeof(GetWholeBodyPseudoHash).FullName); } private MemoryStream _memoryStream=new MemoryStream(); public override void Initialize() { _memoryStream.Dispose(); _memoryStream = new MemoryStream(); } protected override void HashCore(byte[] array, int ibStart, int cbSize) { _memoryStream.Write(array, ibStart, cbSize); } protected override byte[] HashFinal() { return _memoryStream.ToArray(); } } ... var bytes = new Hash(yourAssembly).GenerateHash(new GetWholeBodyPseudoHash());
source share