У меня есть проект, который использует генерацию динамического кода для создания прокси-класса. Этот прокси-класс использует внутренние классы проекта (так что детали реализации не отображаются), поэтому я использую InternalsVisibleTo с именем моей динамически сгенерированной сборки. Это работало до недавнего времени, когда мой клиент наложил требование о том, чтобы все отправленные сборки были сильно названы.InternalsVisibleTo для динамически генерируемой сборки, но с сильным именем
Проблема возникает из-за того, что для использования InternalsVisibleTo с узлом с сильным именем сборки, которые он ссылается, также должны быть сильными, и вы должны предоставить открытый ключ. Где я зацикливаюсь, как обеспечить сильное имя для динамически созданной сборки. Вот то, что я сделал до сих пор:
- Я создал новую пару ключей для динамических сборок, так что .snk может быть отправлен вместе с продуктом (очевидно, что мы не хотим, чтобы корабль. snk используется для подписания остальной части сборки проекта.)
- Я извлек PublicKey и обновил мой InternalsVisibleTo для использования нового динамического PublicKey для динамически связанных сборок.
Я попытался подписать динамически генерируемые сборки, как это:
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? Я могу просто сделать необходимые классы общедоступными, но это приводит к утечкам деталей реализации, которые лучше всего заключить в капсулу.
Какое динамическое генерирование кода вы используете? Reflection.Emit? CodeDom? Сесил? –
Генерация осуществляется через Reflection.Emit. –
[Moq] (http://code.google.com/p/moq/) делает это, вы можете спросить его исходный код ... ;-) – Lucero