2010-04-17 6 views
14

런타임시 C#에서 클래스를 동적으로 생성하는 것에 대해 궁금해하고이 기사를 우연히 발견했습니다. http://olondono.blogspot.com/2008/02/creating-code-at-runtime.html 런타임시 클래스 생성과 관련하여 장단점에 대해 궁금합니다.런타임시 C# 클래스 만들기

의견이 있으십니까?

+0

이 질문에 대한 추가 사항? Reflection을 사용하여 런타임에 작성한 코드를 어셈블리에 저장할 수 있습니까? 이렇게하면 다시 만들 필요가 없습니다. –

+0

예, 실제로 제공 한 링크는 생성 된 코드를 저장합니다. –

+0

권. 재미 있은 그 부호의 마지막 부분. 얼마나주의를 기울이고 있는지 보여줍니다. 미안합니다. –

답변

19

메타 프로그래밍에는 빌드 타임 코드 생성의 모든 이점이 있지만 추가 코드 단계는 없습니다. 이것은 ORM, 시리얼 라이저, AOP, DI/IoC 컨테이너 등의 라이브러리 코드에서 매우 일반적입니다.

  • +는
  • + 같은 코드가 실제로 오히려 어떤 드문 가장자리 경우 또는 래퍼를 많이 처리하는 것보다, 런타임시의 경우 무엇을 처리 할 수있는 별도의 빌드 단계 또는 쓰기 평범한 코드에 대한 필요성을 방지 래퍼 (장식 패턴) 주위
  • + 메타 데이터를 런타임에만 알려진 시나리오 CODEGEN 허용
  • + IL 민간 분야 등 DynamicMethod은 유형과 연관 될 수있는 방법 덕분에 더 접근 할 수있는 실행; 완전히 생성 된 (dll) 코드는 [InternalsVisibleTo] 또는 이와 유사 할 수 있습니다. 불가능할 수도 있습니다.
  • - 일부 시스템은 을 지원합니다. runtime code-gen; 일부 서버 설정, 소형 프레임 워크, iPhone 등에서 비활성화 됨
  • - 버그 ugly 할 일입니다. 방법에 관계없이 이 아니고 정상 코드입니다.
  • 는 -이 일이 실제로 내부적으로 어떻게 작동하는지 정말 좋은 이해를 필요로
  • + 힘은 당신이 일이 실제로 내부적으로 어떻게 작동하는지 정말 좋은 이해를 얻을 경우

나는 현재 다시 해요 런타임 IL 생성을 사용하기 위해 기존 라이브러리를 씁니다. 그것은 매우 보람이 있으며 나는 그것에 만족합니다. 하지만 그것은 과 다르다. 나는 전에 썼다.

+0

의견을 보내 주셔서 감사합니다. –

0

이미 런타임 생성 클래스에 대한 경험이있을 것입니다. 제네릭은 런타임에 CLR에 처음 빌드 될 때 빌드됩니다. XmlSerializer의 구현도 마찬가지입니다.

런타임시 빌드 클래스는 매우 복잡합니다 (반사 및 코드 돔 코드를 많이 보지 않는 한). 이것은 가장 단순하고 단순한 해결책이었습니다.

0

장점 : 필요한 경우 런타임에 만들 수 있습니다.

단점 : 컴파일 타임 검사가 없으므로 잘못 될 경우 모든 것이 터집니다.

기본적으로 리플렉션 사용의 장단점과 동일합니다.

5

이것은 장단점이 아닙니다.

때로는 다른 방법으로 코드로 변환하는 것이 지루한 정보 나 런타임까지 사용할 수없는 정보를 기반으로 클래스를 만드는 것이 편리합니다.

링크 된 기사의 예제는 이 아니며 사용자는 (응용 프로그램 프로그래머로서)이 일반적으로 수행합니다. 그러나이 도구는 예를 들어 데이터베이스 또는 XML 스키마를 기반으로 클래스를 생성하는 도구에서 유용합니다.

2

모든 것을 포함하여 시간과 장소가 있습니다 (예 : 제네릭). 그러나 앞서 진행하기 전에 런타임에 클래스를 생성하는 대안을 고려할 것입니다. 클래스 생성에 대한 대안을 유지하는 것이 더 쉽고 쉽습니다.

0

마음에 샘솟는 것은 메모리 사용량입니다. 요청을 수신 할 때마다 일부 요청을 처리하도록 클래스를 동적으로 빌드하면 매번 같은 값에 대해 새 클래스를 생성 할 위험이 있습니다. 클래스 또는 어셈블리가 앱 도메인에로드되면 언로드 할 수 없습니다. 따라서 생성 된 어셈블리 및 클래스는 가능한 한 캐시하십시오.

관련 문제