Выпуск источника библиотеки классов без подписи файла ключа, но модульные тесты требуют доступа к внутренним классам, что делать? - PullRequest
6 голосов
/ 14 ноября 2010

Ситуация следующая:

  1. Я хочу выпустить полный исходный код для библиотеки классов
  2. Я также хочу выпустить двоичные файлы, подписанные мной, с ключомфайл, который я не хочу публиковать
  3. Я предоставлю пакетные файлы и этапы предварительной сборки, которые создадут новый файл ключа локально, если его нет, чтобы любой мог быстро начать использовать исходный код
  4. Тестовый проект нуждается в ссылке на внутренний класс в основном проекте
  5. Чтобы получить доступ к внутреннему классу, мне нужно добавить атрибут [assembly: InternalsVisibleTo("...")] в основной файл AssemblyInfo.cs проекта
  6. Поскольку я подписываю выходные данные проекта, мне нужно указать часть PublicKey этого атрибута
  7. Затем он будет привязан к файлу ключа, который я не хочу публиковать

Итак, как мне решить эту проблему?

Если я подпишу основной вывод проекта, а не тестовую библиотеку и укажу только имя сборки в атрибуте InternalsVisibleTo, я получу этотошибка времени:

Ошибка 1 Недопустимая ссылка на сборку друга 'Mercurial.Net.Tests'.Сборки со строгим именем должны указывать открытый ключ в своих объявлениях InternalsVisibleTo.C: \ Dev \ VS.NET \ Mercurial.Net \ Mercurial.Net \ Properties \ AssemblyInfo.cs 22 31 Mercurial.Net

Так что, очевидно, недостаточно подписать выходные данные тестового проекта.

Является ли мой единственный способ удалить параметры, которые подписывают проекты, и изменить файлы проектов как часть моего сценария сборки двоичных файлов?то есть.Выследить элемент <SignAssembly>false</SignAssembly> файла проекта и изменить его перед сборкой?

Ответы [ 3 ]

2 голосов
/ 14 ноября 2010

Есть ли возможность иметь файл SNK, который вы выпускаете только для тестирования?

Затем вы можете получить два InternalsVisibleTo и переключить тот, который вы используете, с помощью #if,Например:

#if FOR_RELEASE
[InternalsVisibleTo(... your private SNK ...)]
#else
[InternalsVisibleTo(... test SNK which you release ...)]
#endif

Затем вы можете установить FOR_RELEASE при создании ваших сборок, которые вы хотите опубликовать.

1 голос
/ 14 ноября 2010

На ум приходит #ifdef, используя "eval" ключ, который вас не волнует.

1 голос
/ 14 ноября 2010

То, что я сделал со своими проектами ОС, просто: у меня есть частный SNK, который я использую только при создании проектов для релиза.Проекты подписываются только когда я компилирую релиз, и обычно проекты не ссылаются на SNK.Это облегчает использование атрибута InternalsVisibleTo, потому что без SNK это всегда работает.

...