c#
-
프로토버프 MergeFrom()에서 만난 오류(feat. 'System.Runtime.CompilerServices.Unsafe)개발/C# 2025. 2. 5. 22:29
서버와 클라이언트가 proto 파일을 컴파일한 결과물인 클래스 파일을 공유하는데 어떻게 역직렬화하는 과정에서 오류가 생길 수 있을까. 결론부터 말하자면 System.Runtime.CompilerServices.Unsafe의 버전 문제였다. 프로토버프를 서버와 연동하는 과정에서 System.Runtime.CompilerServices.Unsafe.dll을 csharp 환경에 있는 라이브러리에서 가져다 썼었다.C:\Program Files\dotnet\shared\Microsoft.NETCore.App\8.0.12 여기에 있던 dll 버전이 낮았나 보다. 전체 오류 메시지를 보면 버전이 언급되어 있었다.Could not resolve type with token 010000a6 from typeref (ex..
-
프로토버퍼 연동(feat. C# 프레임워크)개발/C# 2025. 1. 28. 13:01
C# 프레임워크는 하나가 아니다. C++를 주로 하다가 C#도 이참에 해두면 좋을 것 같아서 시작했는데 프레임워크 종류를 면밀히 살피지 않고 그러려니 했었다. "뭐 대충 다 호환되겠지!". 어떤 일이든 조금이라도 얕잡아 보는 순간 역으로 당하는 법이다.어디에는 있는 API가 저기에는 없어 프로젝트를 마이그레이션 해야 했고, dll을 복사 붙여넣기 하니까 에러 로그 하나 안 뜨고 제대로 동작하지 않았다. 대상 프레임워크가 다른 것이 이유였음을 알게 됐다. 프로토버프도 마찬가지로, 여기에서 간단하게 설명할 것은 닷넷8.0으로 만든 서버 프로젝트와 2022.3.55f 유니티를 프로토버프로 연동하는 방법이다. 추가적으로 서버 프로젝트의 서버 로직의 dll을 유니티 프로젝트에서도 동작할 수 있게 해볼 거다.서버 ..
-
split()개발/C·C++ 2021. 9. 11. 23:26
C#, Java, JavaScript에 있는 문자열 자르기 함수인 split()이 C++에는 없습니다. 필요하면 만들어 써야 합니다. 막상 급하게 필요할 때 문자열 함수가 익숙하지 않다면 생각보다 오래 걸릴 수 있습니다. 미리 만들어서 사용합시다. split() vector split(string s, string delim) { size_t off = 0; vector result; while (true) { size_t pos = s.find(delim, off); size_t count = pos - off; string str = s.substr(off, count); result.push_back(str); off += count + 1; if (0 == off) break; } return r..
-
BitConverter.ToIntXX() 함수 구현해보기개발/C·C++ 2019. 11. 6. 02:35
C#은 C++과 Java의 장점을 두루 갖고 있다. 비교적 늦게 태어난 언어인 만큼 단점보다는 장점이 더 많아 보인다. 네트워크 라이브러리 쓰기도 편하고 스레드도 지원을 잘한다. Java는 손을 뗀 지 조금 돼서 잘 모르겠는데, C#에는 여러 종류의 변환 함수를 지원한다. 문자열 변수를 바이트로 변환해준다든가(Encoding.UTF8.GetBytes(Name)), char형 배열에서 오프셋을 지정해 원하는 바이트만큼 읽어온다든가. 후자의 기능을 갖고 있는 함수가 BitConverter.ToIntXX() 계열의 함수다. 사실은 이 함수를 똑같이 구현하는 게 목적이 아니라 내부적으로 어떤 원리를 갖고 있는지 알아보려고 한다. 설명하려고 하는 함수는 가변 버퍼에서에서 발견할 수 있다. 서버 프로그래밍에서 가변..