2009-02-24 3 views
7

프로젝트를위한 소규모 클래스 생성기를 만드는 중입니다. 나는 CodeDOM에 대해 읽었으므로 클래스를 생성하는 의미가 문제가되지는 않지만 생성 및 배포 프로세스에 세대를 가장 잘 통합하는 방법은 확실하지 않습니다.C# 코드 생성

  1. 클래스 생성을 어떻게 트리거해야합니까? 빌드 프로세스의 일부로 읽어야합니다. 어떻게해야합니까?

  2. 클래스는 어디에 만들어야합니까? 나는 파일을 손으로 편집해서는 안되며 소스 제어에 체크해서는 안된다는 것을 읽었다. 나는 이것에 대해 걱정하고 생성기 엔진과 동일한 디렉토리에 클래스를 생성해야합니까?

답변

0

질문에 대한 답변은 부분적으로 생성 된 클래스의 용도에 따라 다릅니다.

개발의 일부로 클래스가 생성되는 경우 클래스를 텍스트 파일로 생성하고 다른 클래스와 마찬가지로 SCM을 검사해야합니다.

시스템 운영의 일부로 클래스가 런타임에 동적으로 생성되는 경우 CodeDOM을 전혀 사용하지 않을 것입니다. 나는 Reflection을 사용할 것이다.

8

T4 템플릿 (VS2008에 내장되어 있음)을 살펴보십시오. 그것은 당신을위한 코드를 생성하는 "템플릿"클래스를 만들 수 있습니다. Oleg Sych은 이에 대한 귀중한 자료입니다.

Link for Oleg's tutorial on code generation.

+0

어떻게 빌드 문제가 해결 되었습니까? 이것이 블루라는 의미인지 잘 모르겠습니다 만, 자동 생성 된 코드를 빌드에 포함시키고 싶습니다 ... C# 클래스를 생성하는 IDL 파일이 있습니다. 이제 다른 팀원이 IDL을 변경하면 C# 클래스를 다시 작성해야합니다. 템플릿 주소는 그걸까요? – ripper234

+0

모든 빌드에서 클래스를 생성하도록 T4 템플릿을 구성 할 수 있습니다. 그것은 시간이 많이 걸리지 않으며 좋은 습관입니다. –

+0

@Michael : 빌드가 느려지므로 파일을 불필요하게 재생성해서는 안됩니다. 빌드 속도를 늦추는 모든 것이 합쳐져 반복해서 느껴집니다. 이 문제가 빌드에서 잘 설정된 후에 수정하는 것보다 방지하기가 더 쉽다고 말하면 절 믿으십시오. –

0

나는 T4 템플릿이 있다는 것을 안다. (많은 사람들이이 템플릿을 사용한다는 것을 알고있다.) 나는 그것을 사용하지 않았다. 그 외에도 다음과 같은 두 가지 주요 옵션이 있습니다.

  1. 프로젝트 내에서 소스를 바로 변형하려면 SingleFileGenerator를 사용하십시오. 편집 한 문서를 저장할 때마다 자동으로 코드 파일이 재생성됩니다. 소스 컨트롤을 사용하면 생성 된 파일이 프로젝트의 일부로 체크인됩니다. 다음과 같은 몇 가지 제한 사항이 있습니다.
    • 입력마다 하나의 출력 만 생성 할 수 있습니다.
    • 파일이 생성되는 순서를 제어 할 수 없으며 빌드시 파일이 생성되지 않으므로 출력은 단일 입력 파일에서만 효과적으로 파생 될 수 있습니다.
    • 입력 파일을 편집하려는 경우 단일 파일 생성기를 개발자의 컴퓨터 에 설치해야합니다. 생성 된 코드는 소스 제어에 있기 때문에 입력을 편집하지 않으면 출력을 다시 생성 할 필요가 없습니다.
    • 입력이 저장 될 때만 출력이 생성되기 때문에 출력은 입력 파일의 정확한 내용 (시스템 클럭 포함) 이외의 다른 상태에 의존해서는 안됩니다.
  2. 빌드의 일부로 코드를 생성하십시오. 이를 위해 MSBuild 대상 파일을 작성합니다. 이를 위해 입력 및 출력을 완벽하게 제어 할 수 있으므로 종속성을 처리 할 수 ​​있습니다. 필요한 경우 시스템 상태를 입력 종속성으로 처리 할 수 ​​있지만 코드 생성이 필요한 모든 빌드는 이전에 생성 된 결과를 사용하는 빌드보다 오래 걸립니다.결과 (생성 된 소스 파일)는 일반적으로 obj 디렉토리에 있으며 csc (C# 컴파일러)으로가는 입력 목록에 추가됩니다. 이 방법의 한계 :
    • SingleFileGenerator보다 대상 파일을 작성하는 것이 더 어렵습니다.
    • 빌드는 사용자가 입력을 편집하는지 여부에 관계없이 출력 생성에 따라 다릅니다.
    • 생성 된 코드가 프로젝트의 일부가 아니기 때문에 생성 된 코드를 중단 점 설정과 같은 것으로 보는 것이 약간 어렵습니다.