Обеспечение вызова сборки через указанную сборку - PullRequest
0 голосов
/ 18 мая 2010

Существуют ли какие-либо встроенные функции для определения, вызывается ли сборка из определенной сборки?

У меня есть сборка A, которая ссылается на сборку B. Сборка A предоставляет командлеты PowerShell и выводит типы, которые находятся в B. Некоторые методы и свойства с типами, предоставляемыми B, представляют интерес для типов в сборке A, но не интересуют потребителей PowerShell или тех, кто пытается загрузить типы в B напрямую и вызывать методы внутри него.

Я изучил InternalsVisibleToAttribute, но это потребовало бы обширной переделки из-за использования интерфейсов. Я разрабатывал систему общих ключей, которая позже была бы запутана, но казалась неуклюжей.

Есть ли способ, чтобы B вызывался только A?

Ответы [ 2 ]

4 голосов
/ 18 мая 2010

Для этого вы использовали бы ключ строгого имени в своих сборках.

Сначала убедитесь, что вызывающая сборка (сборка A) имеет строгое имя со знаком (это можно сделать на экране свойств проекта на вкладке Подписывание)

Следующий код извлекает ключ строгого имени из вызывающей сборки.

internal static StrongName GetStrongName(Evidence evidence)
{
    foreach (var e in evidence)
    {
        if (e is StrongName)
        {
            return (StrongName)e;
        }
    }
    throw new ArgumentException();
}

Самый простой способ - подписать обе сборки одним и тем же StrongName, а затем убедиться, что Assembly.GetCallingAssembly (). Evidence и Assembly.GetExecutingAssembly (). Доказательства подписаны одним и тем же StrongName.

var callerKey = GetStrongName(Assembly.GetCallingAssembly().Evidence).PublicKey;
var execKey = GetStrongName(Assembly.GetExecutingAssembly().Evidence).PublicKey;

if (callerKey != execKey)
{
    throw new UnauthorizedAccessException("The strong name of the calling assembly is invalid.");
}

Это может быть нецелесообразно для реализации поверх существующей кодовой базы, но взгляните на LinFu AOP , вы должны иметь возможность реализовать атрибут, который может быть присоединен к классам, которые необходимо проверять на допустимость вызывающий.

2 голосов
/ 18 мая 2010

я думаю InternalsVisibleToAttribute - лучший вариант. Еще одна опция проверки Assembly.GetCallingAssembly

...