Согласно предложению Эрика, я решил это, проверив ключ самостоятельно. В коде, который я хочу защитить, я добавляю следующий вызов,
EnsureAssemblyIsSignedByMyCompany( Assembly.GetCallingAssembly() );
Тогда реализация этого метода будет
/// <summary>
/// Ensures that the given assembly is signed by My Company or Microsoft.
/// </summary>
/// <param name="assembly"></param>
private static void EnsureAssemblyIsSignedByMyCompany( Assembly assembly )
{
if ( assembly == null )
throw new ArgumentNullException( "assembly" );
byte[] pubkey = assembly.GetName().GetPublicKeyToken();
if ( pubkey.Length == 0 )
throw new ArgumentException( "No public key token in assembly." );
StringBuilder builder = new StringBuilder();
foreach ( byte b in pubkey )
{
builder.AppendFormat( "{0:x2}", b );
}
string pkString = builder.ToString();
if ( pkString != "b77a5c561934e089" /* Microsoft */ &&
pkString != "abababababababab" /* Ivara */ )
{
throw new ArgumentException( "Assembly is not signed by My Company or Microsoft. You do not have permission to call this code." );
}
}
** Имена и ключи изменены, чтобы защитить невинных. Любое сходство с реальными именами или компаниями - просто совпадение. *