В C # у нас есть пространства имен в .proto, которые мы получаем из protobuf-net, мы не получаем никаких пространств имен. Таким образом, вопрос в том, как заставить protobuf-net генерировать (и использовать внутри) файлы .proto с именами-пакетами / пакетами.
Пример, когда мы проанализировали весь наш проект для создания файлов .proto для подключения приложения C ++ к нашему приложению C #, мы получили тонны
enum AnimationCode {
None = 0;
Idle = 1;
//...
}
а также
enum SessionCode {
None = 0;
//...
}
И поэтому, когда мы передали этот унифицированный файл проекта .proto компилятору protogen, мы получили тонны
Тип перечисления «SessionStateCode» не имеет значения с именем «Нет».
а также
Обратите внимание, что значения перечисления используют правила области видимости C ++, то есть значения перечисления
братья и сестры своего типа, а не дети этого.
и нет кода C ++.
Цель состояла в том, чтобы сделать так, чтобы закодированное сообщение C # было бы по крайней мере читабельным из C ++
В настоящее время в protobuf-net нет кода для выполнения автоматических исправлений коллизий имен, хотя мне было бы интересно узнать, есть ли у вас какие-либо предложения. Другой вариант будет:
enum AnimationCode {
[ProtoEnum(Name="AnimationCode_None")]
None = 0,
Idle = 1
}
Здесь .proto будет использовать AnimationCode_None
когда генерируется сценарий; на самом деле это будет:
enum AnimationCode {
AnimationCode_None = 0;
Idle = 1;
}
Я проверил MetaType
/ValueMember
API, и похоже, что в настоящее время было бы трудно установить .Name
во время выполнения, но это может быть исправлено в новом выпуске достаточно легко (как с это подобное перечисление /MetaType
фиксировать), если вы предпочитаете устанавливать их во время выполнения, а не украшать атрибутами.
Вы пробовали это?
package MyNamespace{
enum AnimationCode {
None = 0;
Idle = 1;
//...
}
}