>  기사  >  백엔드 개발  >  C#에서 ILGenerator를 사용하여 함수 인스턴스를 동적으로 생성하는 방법

C#에서 ILGenerator를 사용하여 함수 인스턴스를 동적으로 생성하는 방법

黄舟
黄舟원래의
2017-09-02 15:04:461826검색

이 글에서는 ILGenerator를 사용하여 C#에서 동적으로 함수를 생성하는 간단한 코드를 주로 소개합니다. 필요한 친구들은 참고하면 됩니다.

게임 서버에는 항상 읽어야 할 구성 파일이 많고, 이러한 구성 파일은 다음과 같습니다. * 필수 그렇지 않으면 단순히 문자열이나 숫자의 묶음인 약한 유형으로 만들어지며 오류를 볼 수 없습니다(다시 확인해야 함) * 그렇지 않으면 강한 유형으로 만들어지며, 각 유형은 자체적으로 구문 분석되어야 합니다

저는 개인적으로 후자를 선호합니다. 이전 LoadConfig의 코드는 간단하지만 로직 작성 시 코드가 간단하지 않기 때문입니다.


class Config1 : public IConfig {
 public void Fill(EntryLine& line);
 int32_t param1;
 string param2;
 std::vector<int32_t> param3;
};
void Config1::Fill(EntryLine& line) {
 this->param1 = line.ReadInt32();
 this->param2 = line.ReadString();
 this->param3 = line.ReadVectorInt32();
}

대략적인 채우기 기능은 위에 쓴 것과 같습니다. , 하지만 ReadInt32와 같은 함수는 허구이며 직접 구현해야 합니다(흠)

그러면 이런 종류의 코드는 작성하기가 매우 짜증나고 실제로 작성하고 싶지 않습니다. 이것이 바로 이 글을 쓰는 이유입니다.

C#에는 XML 역직렬화가 있습니다. 저는 다음과 같이 클래스를 정의합니다.


class Config1 {
 int32 param1;
 string param2;
 int[] param3;
}
XmlSerializer serializer = new XmlSerializer(typeof(Config1));
var obj = (Config1)serializer.Deserialize(stream);

이 역직렬화는 매우 간단합니다. 제가 실제로 원하는 것은 Xml 역직렬화가 Node를 사용한다는 것입니다. 그 중 하나는 속성의 값입니다.

이를 제공한 Microsoft에 감사드립니다. .NET Framework 기능을 디버깅하기 위해 .NET 소스 코드를 디버그하고 Microsoft가 이를 어떻게 구현하는지 확인할 수 있습니다. 일부 조사에 따르면 그는 실제로 XmlSerializer가 생성될 때 Config1을 분석한 다음 일부 메타데이터와 읽기/쓰기 메서드를 생성했으며 Deserialize는 Read 메서드를 호출합니다.

이제 구현 방법을 알았으니 짐작할 수 있을 것입니다.

기본적으로 프로토타입을 먼저 파악한 다음 프로토타입을 프로그래밍해야 합니다.

PS: 아직 성능을 테스트하지는 않았지만 나쁘지 않을 것입니다. 문제는 서버 시작이 몇 초 더 느리다는 것입니다.

위 내용은 C#에서 ILGenerator를 사용하여 함수 인스턴스를 동적으로 생성하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.