InternalsVisibleTo для динамически генерируемой сборки, но с сильными именами - PullRequest
3 голосов
/ 08 февраля 2011

У меня есть проект, который использует динамическую генерацию кода для создания прокси-класса. Этот прокси-класс использует внутренние классы проекта (чтобы детали реализации не отображались), и поэтому я использую InternalsVisibleTo с именем моей динамически генерируемой сборки. Это работало нормально до недавнего времени, когда мой клиент наложил требование, чтобы все поставляемые сборки имели строгое имя.

Проблема возникает из-за того, что для использования InternalsVisibleTo со сборкой со строгим именем сборки, на которые она ссылается, также должны иметь строгое имя, и вы должны предоставить открытый ключ. Я застреваю в том, как дать строгое имя для динамически генерируемой сборки. Вот что я сделал до сих пор:

  1. Я создал новую пару ключей для динамических сборок, чтобы .snk можно было поставлять вместе с продуктом (очевидно, мы не хотим отправлять .snk, используемый для подписи остальных сборок проекта).
  2. Я извлек PublicKey и обновил свой InternalsVisibleTo, чтобы использовать новый динамический PublicKey для динамически ссылающихся сборок.
  3. Я попытался подписать динамически сгенерированные сборки следующим образом:

        var name = new AssemblyName("ProxyBuilderAssembly");
        var attributes = new CustomAttributeBuilder[1];
        attributes[0] =
            new CustomAttributeBuilder(typeof(AssemblyKeyFileAttribute).GetConstructor(new[] {typeof(string)}),
                                       new object[] {"Dynamic.snk"});
        _assembly = AppDomain.CurrentDomain.DefineDynamicAssembly(name, AssemblyBuilderAccess.RunAndSave, attributes);
        _module = _assembly.DefineDynamicModule("ProxyBuilderAssembly", "ProxyBuilderAssembly.dll");
    

К сожалению, это не работает, и мне было очень трудно найти какую-либо документацию о том, как это должно работать. Кто-нибудь знает, как подписать динамически генерируемую сборку, чтобы ей можно было получить доступ через InternalsVisibleTo? Я могу просто сделать необходимые классы открытыми, но это приводит к утечке деталей реализации, которые лучше оставить в инкапсуляции.

1 Ответ

4 голосов
/ 08 февраля 2011

В MSDN есть статья " Как: использовать полную подпись для придания динамической сборке строгого имени ", в которой показано, как подписывать сборки, созданные с помощью Reflection.Emit.

StrongNameKeyPair kp;
// Getting this from a resource would be a good idea.
using(stream = GetStreamForKeyPair())
{
    kp = new StrongNameKeyPair(fs);
}
AssemblyName an = new AssemblyName();
an.KeyPair = kp;
AssemblyBuilder ab = AppDomain.CurrentDomain.DefineDynamicAssembly(an, AssemblyBuilderAccess.RunAndSave);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...