Ограничить доступ к объекту из другого проекта

Есть 3 проекта: A -> B, C (-> - A имеет ссылку на проект B)

В проекте B находятся основные классы, методы и т.д., в т.ч. DTO классы, которые используются в основном для сериализации и десериализации. Проекту A эти классы видеть не нужно, поэтому у всех них стоит модификатор internal. Данные между проектом B и C передаются в формате json, а значит, их необходимо десериализовать после передачи. Из-за этого приходится создавать абсолютно одинаковые классы и в проекте B, и в проекте C, и назначать им модификатор internal.

Суть проблемы: Можно ли с помощью каких-нибудь атрибутов или механизмов ограничить видимость к этим классам из проекта A, но предоставить из проекта C, оставив реализацию этих классов только в проекте B?

Пример такого класса. Абсолютно такой же есть на проекте B и C:

internal class SessionDto
{
    public Guid OrderId { get; set; }

    public List<OrderDto> Orders { get; set; }

    public int Version { get; set; }

    public SessionDto() { }

    public SessionDto(Guid orderId, List<OrderDto> orders, int version)
    {
        OrderId = orderId;
        Orders = orders;
        Version = version;
    }
}

Ответы (1 шт):

Автор решения: Frehzy

Думаю, стоит всё же ответить на вопрос, если кто-нибудь в дальнейшем столкнётся с данной проблемой.

Проблема звучит следующим образом - как ограничить доступ к объектам одного проекта, не дублируя их в других, применив модификатор доступа internal.

Ниже будут описаны действия, которые нужно выполнить:

  • Создаём дополнительный проект Shared.dll.

  • Добавляем ссылку на этот проект любому другому, которому необходимы internal-объекты.

  • Создаём в проекте Shared.dll папку Properties, а в ней класс AssemblyInfo.cs (его создать можно через меню "Добавить").

  • Добавляем следующие строки в этот файл:

    [assembly: InternalsVisibleTo("T")]

где T - Название проекта. Visual Studio сама подскажет, какие названия можно туда ставить.

  • Создаём какие-либо объекты в проекте Shared.dll и добавляем им модификатор доступа internal.

Таким образом, в указанных проектах (в файле AssemblyInfo) будут видны internal объекты, описанные в Shared.dll.

Пример взаимодействия:

internal class Shared.SomeClass //объект в проекте Shared.dll
{
    public Guid Id { get; set; }
}

Добавляем в проект B ссылку на Shared.dll. Взаимодействие будет выглядеть следующим образом: Shared.SomeClass....

Добавляем в проект A ссылку на B. Взаимодействие будет выглядеть следующим образом: Shared.SomeClass... - VisualStudio покажет ошибку, т.к. не видит данный класс.

Тем не менее, создав в проекте Shared.dll какой-либо публичный объект:

public class Shared.SomeClass2 //объект в проекте Shared.dll
{
    public Guid Id { get; set; }
}

И выполнив те же действия - Shared.SomeClass2... - VisualStudio ничего против не скажет.

Надеюсь, помог кому-нибудь в будущем.

Спасибо Mark Shevchenko и Pavlo Khyzhniak.

Полезные ссылки:

InternalsVisibleToAttribute

→ Ссылка