2012-01-13 2 views
3

면도기 ViewEngine에서 Parse 메소드를 호출하면 오류 목록이 포함 된 TemplateComplilationException으로 컴파일 오류가 발생합니다. 이러한 오류는 임시 파일 이름을 나타내지 만 파일에 액세스하기 전에 파일이 삭제됩니다.면도기 ViewEngine 임시 컴파일 .cs 파일

static void Main(string[] args) 
{ 
    var service = TemplateServiceFactory.CreateTemplateService(Language.CSharp, true); 
    string result = ""; 
    try 
    { 
     result = service.Parse("Hello @DateTime.NowXX "); 
    } 
    catch (TemplateCompilationException ex) 
    { 
     foreach (var error in ex.Errors) 
     if (!string.IsNullOrEmpty(error.FileName)) 
      Console.WriteLine(File.ReadAllText(error.FileName)); 
    } //           ^^^^ File does not exist! 

    Console.WriteLine(result);  
    Console.ReadKey(); 
    } 

(약간의 배경) 는 내가 면도기 엔진 "독립형"MVC없이 사용하고 있습니다. Parse으로 전화 할 때 가능한 한 많은 정보를 사용자에게 표시하려고합니다.

+2

실행/컴파일 디렉토리에서 .cs 파일을 복사하기 위해'FileSystemWatcher'를 추가 했습니까? – arootbeer

+0

나를 위해 발사하는 FileSystemWatcher를 가져올 수 없습니다. – Mick

답변

3

RazorEngine의 TemplateCompilationException은 CompilerError 개체를 포함하는 CompilerErrorCollection을 래핑하는 클래스입니다. 따라서 TemplateCompilationException CompilerError 개체에서 얻을 수있는 가장 자세한 내용은 각각의 속성으로 디버깅하기에 충분합니다. 고려와 나는 이것이 내가 당신에게 발생 된 오류 (들)을 지시하고 사용자를 위해 참조 할 템플릿 데이터를 덤프 할 수있는 무엇을 얻을 내 예제를 실행하면이 예

try 
{ 
    Razor.Parse("My erroneous @DateTime.Now.foo()"); 
} 
catch(TemplateCompilationException ex) 
{ 
    foreach(var error in ex.Errors) 
    { 
     StringBuilder sb = new StringBuilder(); 
     sb.AppendLine("Compile Error Num: \t" + error.ErrorNumber); 
     sb.AppendLine("Error Text:\n\t" + error.ErrorText); 
     Console.WriteLine(sb.ToString()); 
    } 
    Console.WriteLine("Erroneous Template:\n\t" + ex.Template); 
} 

을 시도합니다.

Compile Error Num: CS1061 
Error Text: 
    'System.DateTime' does not contain a definition for 'foo' and no 
    extension method  'foo' accepting a first argument of type 
    'System.DateTime' could be found (are you missing a using directive 
    or an assembly reference?) 

Erroneous Template: 
    My erroneous @DateTime.Now.foo() 
+0

OP가 묻는이 방법으로 구문 분석 예외 상황이 발생했을 때 임시 .cs 파일의 내용을 가져올 수 있습니까? –

+0

그들은 또한 면도기 구현을 작동시키는 데 문제가 있으며 내 대답이 도움이 될 것입니다. 임시 컴파일 파일에 대해 논의 중이므로 제작 및 배포 후에 어떻게 내용을 얻을 수 있습니까? 나는 실제 문제를 발견하고 그것을 고치는 것이 (왜 내가 이것을 대답했는지) 임시 파일을 파는 것보다 중요하다고 생각한다. – jlafay

+0

OP의 구현에 문제가 있다고 생각하지 않습니다. 면도기 템플리트에 오류가 없다면 그것은 당신만큼 잘 작동 할 것입니다. 그건 그렇고, 내부적으로, 당신의'Razor.Parse'는 OP가 사용하는 것과 정확히 똑같습니다. 그가하려고하는 것은 컴파일하는 동안 임시 파일을 사용하는 것입니다. –

4

현재 v2.1 릴리스는 소스 코드를 추출 할 수있는 기능을 제공하지 않습니다. 새 v3 코드베이스에는 소스 코드를 푸시 할 수있는 디버깅 기능이 있습니다. 가능하면 코드를 실행 가능하게 만들고 (코드 덤프로 한 번, 한 번은 문자열로) 코드를 두 번 생성하는 것이 이상적이지는 않으므로 기본적으로이 작업을 수행하지 않습니다. 당신은 당신의 구성에 Debug 플래그를 사용하도록 설정해야합니다 :

var config = new TemplateServiceConfiguration { Debug = true }; 
var service = new TemplateService(config); 

이 예외가 발생하면 읽을 수 있도록 소스 코드를 가능하게 할 것이다.

v3 코드베이스로 Roslyn 컴파일러 인프라 스트럭처를 테스트하면 CodeDom 대신 문자열 소스를 사용할 수 있으므로 CodeDom 대신 직접 사용할 수 있습니다. Debug 플래그가 사용 중지 될 가능성에 대해 걱정할 필요없이 소스 코드에 직접 액세스 할 수 있습니다.

v3 (현재 v3.0.7 베타)은 Nuget (Install-Package RazorEngine)에서 사용할 수 있습니다. 나는 지난주에 RTW를 목표로 삼고 있었지만 결코 그것에 도달하지 못했다.