기본 콘텐츠로 건너뛰기

[T4 TextTemplating] Compile 중에 Linq 를 찾을 수 없다는 오류

T4 TextTemplating Engine에서 ProcessTemplate 메서드를 실행하면 다음과 같은 오류가 발생하는 경우가 있다.
"The type or namespace name 'Linq' does not exist in the namespace 'System' - are you missing and assembly reference?
오류 메시지에 표현된 것과 같이 컴파일을 하려고 하는데, Linq 네임스페이스를 찾을 수 없다는 문제다. 이론적으로는 System.Core.dll 의 참조가 필요한데, 참조가 되지 않았거나 다른 버전의 System 네임스페이스가 사용되고 있을 경우를 의심해 볼 필요가 있다.

당연히 T4 Template 파일에는 아래와 같이 관련된 어셈블리를 지정해 주었다.
<#@ assembly name="System.Core" #>

여러 가지 경우의 수와 TextTemplating Engine의 구성을 확인해 보던 중에 Custom Template Engine Host 에 문제가 있는 것을 확인할 수 있었다.

ITextTemplatingEngineHost 라는 것은 "처리 대상이 되는 텍스트 템플릿" 을 입력으로 받아서 처리된 텍스트 파일을 출력으로 반환하는 역할을 담당하는 것이다. 기본으로 제공되는 것은 "TextTemplatingFileGenerator" 다.

실제 구현한 Host에서 어셈블리 참조들을 아래의 코드와 같이 구성을 했었다.
public IList<string> StandardAssemblyReferences {
 get {
  return new string[]
  {
   typeof(System.Uri).Assembly.Location,
   typeof(WizardDataObject).Assembly.Location,
   typeof(FrameworkContext).Assembly.Location
  };
 }
}
실제 디버그를 해 보면 구성된 어셈블리 참조 경로가 다음과 같은 것을 확인할 수 있다.


위의 어셈블리 참조 경로만으로는 'Linq'를 참조할 수 없다는 결론이 나온다. 즉, "System.dll" 만 참조를 하고 "System.Core.dll"은 없기 때문이다.

그래서 위의 코드를 다음과 같이 수정하였다.
public IList<string> StandardAssemblyReferences {
 get {
  return new string[]
  {
   typeof(System.Uri).Assembly.Location,
   typeof(Enumerable).Assembly.Location,
   typeof(WizardDataObject).Assembly.Location,
   typeof(FrameworkContext).Assembly.Location
  };
 }
}
다시 디버그를 떠서 확인을 해 보면 아래의 그림과 같이 어셈블리 참조 경로가 제대로 구성된 것을 확인할 수 있다.



이렇게 되면 "System.Core.dll" 이 등록되기 때문에 정상적으로 컴파일이 진행되어 오류가 발생하지 않는다.

이 글의 처음에서 추정을 했던 다른 버전의 System 네임스페이스가 사용된 것이 아니라, 실제로 System.Core 가 누락되어 발생했던 것을 확인했고, 이를 위한 처리를 적용하는 방법을 알아 보았다.

댓글