@Bodden

Как подключить proto файлы к проекту?

Здравствуйте.
Хотел помучать Тинькофф API gRPC, но пока только мучаюсь сам. Прошу вашей помощи.

Создал класс взаимодействия:

using Grpc.Core;
using Grpc.Net.Client;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Tinkoff.InvestApi.V1
{
    internal class Instruments
    {
        public void Bonds()
        {
            var metadata = new Metadata
            {
                { "Authorization", "Bearer TOKEN"}
            };
            using var channel = GrpcChannel.ForAddress("invest-public-api.tinkoff.ru:443");
        }
    }
}


Добавил proto files в проект
660eba2b46628172992455.jpeg

Изменил конфигурацию
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net8.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>

	<ItemGroup>
		<Protobuf Include="Protos\contracts\*.proto" GrpcServices="Client"/>	
	</ItemGroup>

	<ItemGroup>
    <PackageReference Include="Google.Protobuf" Version="3.26.1" />
    <PackageReference Include="Grpc.Net.Client" Version="2.62.0" />
    <PackageReference Include="Grpc.Tools" Version="2.62.0">
      <PrivateAssets>all</PrivateAssets>
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
    </PackageReference>
  </ItemGroup>

</Project>

Начинаю собирать, получаю кучу ошибок.

660ebaa20a6ef539049158.jpeg

В proto file, пространство имен не менял, директории создал как в proto file.
syntax = "proto3";

package tinkoff.public.invest.api.contract.v1;

option go_package = "./;investapi";
option java_package = "ru.tinkoff.piapi.contract.v1";
option java_multiple_files = true;
option csharp_namespace = "Tinkoff.InvestApi.V1";
option objc_class_prefix = "TIAPI";
option php_namespace = "Tinkoff\\Invest\\V1";

import "google/protobuf/timestamp.proto";

//Тип инструмента.
enum InstrumentType {
  INSTRUMENT_TYPE_UNSPECIFIED = 0;
  INSTRUMENT_TYPE_BOND = 1; //Облигация.
  INSTRUMENT_TYPE_SHARE	= 2; //Акция.
  INSTRUMENT_TYPE_CURRENCY = 3; //Валюта.
  INSTRUMENT_TYPE_ETF = 4; //Exchange-traded fund. Фонд.
  INSTRUMENT_TYPE_FUTURES = 5; //Фьючерс.
  INSTRUMENT_TYPE_SP = 6; //Структурная нота.
  INSTRUMENT_TYPE_OPTION = 7; //Опцион.
  INSTRUMENT_TYPE_CLEARING_CERTIFICATE = 8; //Clearing certificate.
  INSTRUMENT_TYPE_INDEX = 9; //Индекс.
  INSTRUMENT_TYPE_COMMODITY = 10; //Товар.
}

//Денежная сумма в определенной валюте
message MoneyValue {

  // строковый ISO-код валюты
  string currency = 1;

  // целая часть суммы, может быть отрицательным числом
  int64 units = 2;

  // дробная часть суммы, может быть отрицательным числом
  int32 nano = 3;
}

//Котировка — денежная сумма без указания валюты
message Quotation {

  // целая часть суммы, может быть отрицательным числом
  int64 units = 1;

  // дробная часть суммы, может быть отрицательным числом
  int32 nano = 2;
}

//Режим торгов инструмента
enum SecurityTradingStatus {
  SECURITY_TRADING_STATUS_UNSPECIFIED = 0; //Торговый статус не определён
  SECURITY_TRADING_STATUS_NOT_AVAILABLE_FOR_TRADING = 1; //Недоступен для торгов
  SECURITY_TRADING_STATUS_OPENING_PERIOD = 2; //Период открытия торгов
  SECURITY_TRADING_STATUS_CLOSING_PERIOD = 3; //Период закрытия торгов
  SECURITY_TRADING_STATUS_BREAK_IN_TRADING = 4; //Перерыв в торговле
  SECURITY_TRADING_STATUS_NORMAL_TRADING = 5; //Нормальная торговля
  SECURITY_TRADING_STATUS_CLOSING_AUCTION = 6; //Аукцион закрытия
  SECURITY_TRADING_STATUS_DARK_POOL_AUCTION = 7; //Аукцион крупных пакетов
  SECURITY_TRADING_STATUS_DISCRETE_AUCTION = 8; //Дискретный аукцион
  SECURITY_TRADING_STATUS_OPENING_AUCTION_PERIOD = 9; //Аукцион открытия
  SECURITY_TRADING_STATUS_TRADING_AT_CLOSING_AUCTION_PRICE = 10; //Период торгов по цене аукциона закрытия
  SECURITY_TRADING_STATUS_SESSION_ASSIGNED = 11; //Сессия назначена
  SECURITY_TRADING_STATUS_SESSION_CLOSE = 12; //Сессия закрыта
  SECURITY_TRADING_STATUS_SESSION_OPEN = 13; //Сессия открыта
  SECURITY_TRADING_STATUS_DEALER_NORMAL_TRADING = 14; //Доступна торговля в режиме внутренней ликвидности брокера
  SECURITY_TRADING_STATUS_DEALER_BREAK_IN_TRADING = 15; //Перерыв торговли в режиме внутренней ликвидности брокера
  SECURITY_TRADING_STATUS_DEALER_NOT_AVAILABLE_FOR_TRADING = 16; //Недоступна торговля в режиме внутренней ликвидности брокера
}

//Проверка активности стрима.
message Ping {
  google.protobuf.Timestamp time = 1; //Время проверки.
  string stream_id = 2; //Идентификатор соединения
}

//Тип цены.
enum PriceType {
  PRICE_TYPE_UNSPECIFIED = 0; //Значение не определено.
  PRICE_TYPE_POINT = 1; //Цена в пунктах (только для фьючерсов и облигаций).
  PRICE_TYPE_CURRENCY = 2; //Цена в валюте расчётов по инструменту.
}

message Page {
  int32 limit = 1; //Максимальное число возвращаемых записей.
  int32 page_number = 2; //Порядковый номер страницы, начиная с 0.
}

message PageResponse {
  int32 limit = 1; //Максимальное число возвращаемых записей.
  int32 page_number = 2; //Порядковый номер страницы, начиная с 0.
  int32 total_count = 3; //Общее количество записей.
}

message ResponseMetadata {
  string tracking_id = 42; //Идентификатор трекинга
  google.protobuf.Timestamp server_time = 43; //Серверное время
}

message BrandData {
  string logo_name = 1; // Логотип инструмента. Имя файла для получения логотипа.
  string logo_base_color = 2; //	Цвет бренда.
  string text_color	= 3; // Цвет текста для цвета логотипа бренда.
}


Все требуемые зависимости установил:
660ebb485c9c7531780552.jpeg

Прошу, подскажите пожалуйста в чем может быть проблема?

Спасибо.
  • Вопрос задан
  • 221 просмотр
Решения вопроса 1
NikFaraday
@NikFaraday
Student full-stack Developer
Клик сюда
660ebe1a9e832661047201.jpeg

Далее сюда
660ebe371e0df243799837.png

Подключаете .proto файл. После этого делает Rebuild вашего solution'а. Потом даблклик по проекту, в этом .csproj файле ищите секцию ItemGroup в которой будут ваши Protobuf. К ним додаёте аттрибут ProtoRoot, который (Для удобной работы) должен быть таким же как и пусть в аттрибуте Include без указания названия файла .proto

UPD:
Так же стоит отметить, чтобы импортировать в .proto ваш другой .proto, они должны быть хотя бы на одном уровне. Другими словами, вы можете импортировать только файлы, который находятся по архитектуре на том же уровне или ниже, потому что в import запрещено использования символа точки и запятой. Это значит, что вы не сможете выйти на уровень выше
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы