2010-07-08 5 views
0

확장 메서드 정적 클래스를 동적으로 생성 된 어셈블리에 포함하려고 노력하고 있는데, '유형'의 컴파일러 오류가 계속 발생한다는 것을 제외하고는 6 행 28 열에 'this'라는 단어가 있습니다. 'this'를 제거하면 오류가 반환되지 않습니다 (그러나 확장 메서드가 아닙니다).동적으로 생성 된 어셈블리의 확장 방법?

public static void CodeDomDooDad() 
    { 
     using (var provider = new CSharpCodeProvider()) 
     { 
      var compilerParameters = new CompilerParameters(); 

      compilerParameters.ReferencedAssemblies.Add("system.dll"); 
      compilerParameters.CompilerOptions = "/t:library"; 
      compilerParameters.GenerateInMemory = true; 

      var sb = new StringBuilder(); 

      sb.Append("namespace MooCow \n{ \n"); 
      sb.Append("public static class Extensions {\n"); 
      sb.Append("public static string ToMoo(this string s) {\n"); 
      sb.Append("return s.Replace(\" \",\"moo\");\n"); 
      sb.Append("}\n"); 
      sb.Append("}\n"); 
      sb.Append("}\n"); 

      //Console.WriteLine(sb.ToString()); 

      var cr = provider.CompileAssemblyFromSource(compilerParameters, sb.ToString()); 
      if (cr.Errors.Count > 0) 
      { 
       CompilerError error = cr.Errors[0]; 
       Console.WriteLine(
        "error:"+error.ErrorText + 
        " line:" +error.Line + 
        " col:" +error.Column + 
        " isWarning:" + error.IsWarning); 
      } 
     } 
    } 

이것은 잘 작동하는 생성 된 코드입니다.

namespace MooCow { 
public static class Extensions 
{ 
    public static string ToMoo(this string s) 
    { 
     return s.Replace(" ", "moo"); 
    } 
} 

}

답변

0

은 내가, 발견 CSharpProvider 생성자 ... var에 제공 = 새로운에서는 CSharpCodeProvider (새 사전() {{ "COMPILERVERSION", "V3.5"}에 COMPILERVERSION을 추가 할 수 있다고 생각 })

+0

프레임 워크 버전이 machine.config에서 가져 오지 않았습니까? 컴파일러 버전을 가져온 생성자가 없으면 내 이해가되었습니다. – webworm

+0

@webworm 나는 정직하게 기억할 수 없다 : / – bluevoodoo1

관련 문제