2014-03-25 68 views
0

我的程序經常編譯c#代碼,有時候我得到了一個ArgumentException,例如「文件名'C:\ Users - \ AppData \ Local \ Temp \ wvpc3m5m.0.cs'已經在集合中。參數名稱:fileName「。編譯器的CSharpCodeProvider編譯異常

設置爲下一個:

public void Init() 
{ 
    this.compilerParameters = new CompilerParameters 
    { 
     GenerateExecutable = false, 
     GenerateInMemory = true 
    }; 
} 

編譯:

public CompilerResults Compile(String code) 
{ 
    CompilerResults result = this.codeProvider 
     .CompileAssemblyFromSource(this.compilerParameters, code); 

    return result; 
} 

我認爲codeProvider寫傳遞的字符串到一個文件中,有時他嘗試在同一個文件中寫入兩次。

+0

保持CodeProvider沒有意義。只需用* new *操作符創建一個新的。 –

+0

我這樣做,但異常繼續投擲 – digger

回答

0

問題是,所有CSharpCodeProvider的實例都可以在一個時隙內編譯代碼。 此代碼解決問題:

private readonly Object lockCompile = new Object(); 
    public CompilerResults Compile(String code) 
    { 
     CompilerResults result = null; 
     lock (lockCompile) 
     { 
      using (CSharpCodeProvider codeProvider = new CSharpCodeProvider()) 
      { 
       result = codeProvider 
        .CompileAssemblyFromSource(this.compilerParameters, code); 
      } 
     } 

     return result; 
    }