Visual Studio 2017 и новый .csproj InternalsVisibleTo

Где мне поместить InternalsVisibleTo из AssemblyInfo в новый файл проекта Visual Studio 2017 .csproj?


person Luka    schedule 15.03.2017    source источник
comment
Где угодно, выберите один. Если вы хотите, чтобы он был в файле с именем AssemblyInfo.cs, просто добавьте его.   -  person Hans Passant    schedule 15.03.2017
comment
Но я прочитал, что файл AssemblyInfo устарел в новых файлах проекта VS2017 .csproj.   -  person Luka    schedule 15.03.2017
comment
Не совсем так, контент больше не актуален. Атрибуты теперь автоматически создаются во время сборки в меню Проект ›Свойства› Параметры пакета. Это означает, что теперь вы можете добавить этот файл самостоятельно и делать с ним все, что захотите. Если вы не хотите добавлять его, это тоже хорошо, выберите один.   -  person Hans Passant    schedule 15.03.2017
comment
@HansPassant, можно ли сформулировать полный ответ (с примерами) на это или указать на какую-то документацию? Ваш комментарий создает впечатление, что вы можете поместить атрибут либо в AssemblyInfo.cs, либо непосредственно в файл проекта csproj, однако я не могу заставить Visual Studio распознать его и успешно скомпилировать код при помещении атрибута в csproj. Я также не могу найти полную ссылку csproj, в которой перечислены все доступные свойства. Лучшее, что я могу найти, это: msdn.microsoft.com/en-us/library /bb629394.aspx   -  person Aerendel    schedule 30.03.2017


Ответы (3)


Чтобы прояснить комментарий Ханса Пассанта выше, вам просто нужно добавить InternalsVisibleTo в любой файл cs в вашем проекте. Например, я создал файл AssemblyInfo.cs в корне проекта, а затем добавил (только) следующее содержимое:

using System.Runtime.CompilerServices;

[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2, PublicKey=<ADD_KEY_HERE>")]
person noBreakingChanges    schedule 03.04.2017

На всякий случай, если кто-то захочет поместить InternalsVisibleTo в .csproj файл вместо AssemblyInfo.cs (возможный сценарий - иметь соглашение об именах между тестируемым проектом и тестовым проектом), вы можете сделать это следующим образом :

<ItemGroup>
    <AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleTo">
      <_Parameter1>$(MSBuildProjectName).Test</_Parameter1>
    </AssemblyAttribute>
</ItemGroup>

При этом будет сгенерирован следующий код

[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("MyProject.Test")]

внутри автоматически сгенерированного AssemblyInfo.cs (например, для конфигурации отладки и цели .NET Standard 2.0)

/obj/Debug/netstandard2.0/MyProject.AssemblyInfo.cs

Дополнительная информация

Если вы используете .NET Core 3.1 и этот подход не работает, вам, возможно, придется явно сгенерировать информацию о сборке, добавив следующее в ваш .csproj файл:

<PropertyGroup>
  <!-- Explicitly generate Assembly Info -->
  <GenerateAssemblyInfo>true</GenerateAssemblyInfo>
</PropertyGroup>
person Ivan Zaruba    schedule 23.04.2018
comment
Этот прием очень полезен. Если у вас несколько проектов, вы можете использовать directory.build.props файл в корне решения и применить его ко всем вашим проектам. - person Daniel Gimenez; 27.04.2018
comment
Есть ли какая-либо официальная документация по этому подходу, на которую вы могли бы ссылаться? - person julealgon; 29.10.2018
comment
Не уверен, что этот подход задокументирован, поскольку это скорее настройка, чем обычная практика. Но если вы хотите узнать, как это работает, обратитесь к Microsoft.NET.GenerateAssemblyInfo.targets файлу github.com/dotnet/sdk/blob/release/2.1/src/Tasks/ - person Ivan Zaruba; 30.10.2018
comment
Это должен быть принятый ответ, поскольку в вопросе указано, что нужно добавить InternalsVisibleTo в файл .csproj. - person yurislav; 16.01.2019
comment
Это может быть очевидно, но ничего не стоит из-за того, что это не сработает, если для GenerateAssemblyVersionAttribute установлено значение false. - person Cocowalla; 16.04.2019
comment
Альтернативой ($MSBuildProjectName) является $(AssemblyName) в случае, если имя вашего проекта отличается от вашей сборки. - person Andy Danger Gagne; 13.05.2019
comment
Нет необходимости использовать PublicKey в этом случае? - person dashesy; 17.12.2019
comment
@dashesy, этот подход ничего не меняет, как если бы вы использовали атрибут. Вам понадобится ‹_Parameter1› BlaBla, PublicKey = Bla ‹/_Parameter1› для подписанной сборки. - person Ivan Zaruba; 18.12.2019

Начиная с .NET 5, это действительно работает после добавления в ваш csproj:

<ItemGroup>
  <InternalsVisibleTo Include="YourProject.Tests.Unit" />
</ItemGroup>

Работу и обсуждение этой функции можно увидеть в этом PR в репозитории dotnet GitHub.

person Alves RC    schedule 05.02.2021