我的程序经常编译c#代码,有时我得到一个ArgumentException,如"文件名' c:Users- AppDataLocalTempwvpc3m5m.0.cs'已经在集合中了。参数名称:fileName".
下一个是编译器的设置:
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将传递的字符串写入文件,有时他试图在同一个文件中写入两次。
问题是所有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;
}