Очевидно, что вы должны выполнять проверку каждого вызова из вызываемого метода - любая внешняя система, пытающаяся применить ограничения, легко обходит использование отражения.
Из метода, который вы можете использовать
new StackTrace().GetFrame(1).GetMethod().Module.Assembly
чтобы получить вызывающую сборку. Теперь вы можете использовать
callingAssembly.GetName().GetPublicKey()
, чтобы получить открытый ключ вызывающей сборки и сравнить его с открытым ключом вызываемой сборки. Если они совпадают - при условии, что все ваши сборки подписаны одной и той же парой ключей - звонящий принимается как законный звонящий.
Но есть одна дыра - сторонняя сборка может быть задержана с подписью открытого ключа вашей компании и исключена из проверки цифровой подписи. В результате загрузчик загрузит стороннюю сборку со строгим именем и открытым ключом вашей компании, даже если он еще не подписан. Чтобы закрыть эту петлю, вы должны проверить подпись. Управляемого API не существует, и вам нужно P / Invoke
Boolean StrongNameSignatureVerificationEx(
String wszFilePath,
Boolean fForceVerification,
ref Boolean pfWasVerified)
с fForceVerification
, установленным на true
, и проверьте, равен ли результат true
.
Все вместе это может быть довольно много накладных расходов на вызов. Вероятно, возникает искушение кешировать результат, но при условии, что вызывающая сторона имеет разрешение на отражение, манипулировать таким кешем, вероятно, не очень сложно. С другой стороны, вы никогда не будете уверены на 100%. Тот, кто когда-либо контролирует систему, может делать (почти) все, что ему нужно - подключать отладчик, изменять содержимое памяти, управлять библиотеками или всем временем выполнения. Наконец, вы также должны эффективно защитить свою сборку от декомпиляции и модификации.