2011-02-08 3 views
3

У меня есть проект, который использует генерацию динамического кода для создания прокси-класса. Этот прокси-класс использует внутренние классы проекта (так что детали реализации не отображаются), поэтому я использую InternalsVisibleTo с именем моей динамически сгенерированной сборки. Это работало до недавнего времени, когда мой клиент наложил требование о том, чтобы все отправленные сборки были сильно названы.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? Я могу просто сделать необходимые классы общедоступными, но это приводит к утечкам деталей реализации, которые лучше всего заключить в капсулу.

+0

Какое динамическое генерирование кода вы используете? Reflection.Emit? CodeDom? Сесил? –

+0

Генерация осуществляется через Reflection.Emit. –

+0

[Moq] (http://code.google.com/p/moq/) делает это, вы можете спросить его исходный код ... ;-) – Lucero

ответ

4

В MSDN есть статья «How to: Use Full Signing to Give a Dynamic Assembly a Strong Name», в которой показано, как подписать сборки, созданные с помощью 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); 
+0

Спасибо, это было именно то, что мне нужно. Не знаю, почему я не мог найти его в моих предыдущих поисках. Возможность хранить ключ в качестве встроенного ресурса также является хорошим побочным эффектом. –

+0

@ Dan: Я просто искал «MSDN Reflection.Emit Signing» в Google;) Первый результат содержит серию руководств и пошаговых инструкций и включает в себя этот. –

 Смежные вопросы

  • Нет связанных вопросов^_^