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