Можно ли исключить автоматически сгенерированные файлы при импорте классов из одного проекта C# в другой? - PullRequest
1 голос
/ 30 января 2020

Можно ли исключить автоматически сгенерированные файлы при импорте классов из одного C# проекта в другой?

У меня есть один проект, который реализует сервис GRP C на основе классов, сгенерированных из файла proto. .

Кроме того, у меня есть еще один проект, где я тестирую классы первого проекта, такого как сервис GRP C. Во втором проекте я реализовал клиент GRP C для тестирования службы GRP C с той же копией файла прото.

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

Есть ли способ импортировать только определенные c файлы между проектами одного и того же решения?

Я использую следующие директивы в файлах проекта для генерации классов:

  • В первом проекте:
<ItemGroup>
    <Protobuf Include="Protos\Proto.proto" GrpcServices="Server" />
</ItemGroup>
  • Во втором:
<ItemGroup>
    <Protobuf Include="Protos\Proto.proto" GrpcServices="Client" />
</ItemGroup>

И я импортирую классы первого проекта во второй так:

<ItemGroup>
    <ProjectReference Include="..\core\First.csproj" />
</ItemGroup>

И предупреждения такие:

TestClient.cs(53,29): warning CS0436: The type 'Type1' in '/folder1/solution/test_project/obj/Debug/netcoreapp3.1/Class1.cs' conflicts with the imported type 'Type1' in 'Project1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'. Using the type defined in '/folder1/solutiion/test/obj/Debug/netcoreapp3.1/Class1.cs'. [/folder1/solution/test_project/Project2.csproj]

Ответы [ 2 ]

2 голосов
/ 30 января 2020

Вы не можете условно импортировать типы, но вы можете добавить внешний псевдоним к типам в вашем первом проекте при импорте его во второй проект.

Добавьте следующий фрагмент ко второму .csproj

  <Target Name="ChangeAliasesOfStrongNameAssemblies" BeforeTargets="FindReferenceAssembliesForReferences;ResolveReferences">
    <ItemGroup>
      <ReferencePath Condition="'%(FileName)' == 'First'">
        <Aliases>FirstExtern</Aliases>
      </ReferencePath>
    </ItemGroup>
  </Target>

теперь вы можете явно определить, какой тип вы хотите использовать: добавьте это выше всех значений в вашем коде .cs:

extern alias FirstExtern;

и укажите ссылку на типы из первого проекта, указав определенный псевдоним:

FirstExtern::First.Type1 variable;
1 голос
/ 30 января 2020

Я обычно создаю свои файлы прото и их полученный сгенерированный код в одной сборке, а затем ссылаюсь на эту сборку из службы и клиентских сборок. Это сохраняет код, сгенерированный один раз, и исключает дублирование кода.

...