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