IgnoreAccessChecksToAttribute не предоставляет доступ к внутренним типам в ссылочном проекте

#c# #.net

Вопрос:

В моем проекте net5 у меня есть .cs файл с IgnoresAccessChecksToAttribute

 [assembly: IgnoresAccessChecksTo("MyOtherProject")]

namespace System.Runtime.CompilerServices
{
    [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
    public sealed class IgnoresAccessChecksToAttribute : Attribute
    {
        public IgnoresAccessChecksToAttribute(string assemblyName)
        {
            AssemblyName = assemblyName;
        }

        public string AssemblyName { get; }
    }
}
 

Также в моем решении есть «MyOtherProject», который имеет несколько внутренних типов. На него ссылаются через ProjectReference:

 <ProjectReference Include="....srcMyOtherProjectMyOtherProject.csproj" />
 

Когда я пытаюсь использовать один из этих внутренних типов, я получаю сообщение об ошибке

 'Type' is inaccessible due to its protection level
 

Я делаю что-то не так?

Ответ №1:

Поддерживается средой IgnoresAccessChecksToAttribute выполнения, но не компилятором. В основном он предназначен для использования динамически генерируемым кодом, где поддержка компилятора не требуется. Был запрос на извлечение, чтобы получить его в компиляторе, но команда Roslyn отклонила его, см. https://github.com/dotnet/roslyn/pull/20870 .

Один из возможных способов сделать это с помощью https://www.nuget.org/packages/IgnoresAccessChecksToGenerator посылка. Этот пакет создаст для вас ссылочные сборки, чтобы компилятор был доволен.

Но поскольку вы хотите использовать внутренние типы из своего собственного проекта, почему бы вам не пойти по поддерживаемому пути InternalsVisibleToAttribute ? IgnoresAccessChecksToAttribute Это необходимо только в том случае, если вы не можете изменить код сборки, содержащей внутренний тип.