我有一个Windows服务,一直即使在大量并发工作多年运行没有任何问题下面的代码:CSharpCodeProvider,CompilerParameters.GenerateInMemory和CompilerResults.PathToAssembly:古怪的行为
CSharpCodeProvider codeProvider = new CSharpCodeProvider();
CompilerParameters parameters = new CompilerParameters();
parameters.GenerateExecutable = false;
parameters.GenerateInMemory = true;
parameters.OutputAssembly = outputAssemblyFile;
CompilerResults results = codeProvider.CompileAssemblyFromFile(parameters, "file.cs");
if (results.Errors.Count > 0)
{
Console.WriteLine("Compile ERROR");
}
else
{
Console.WriteLine("Compile OK");
Console.WriteLine("Assembly Path:" + results.PathToAssembly);
Console.WriteLine("Assembly Name:" + results.CompiledAssembly.FullName);
}
通常,当代码已成功编译,因为parameters.GenerateInMemory设置为true,results.PathToAssembly为空(如MSDN中指定的)
其中一个问题是,有时代码已成功编译,但result.PathToAssembly不是null。此外,CompiledAssembly正在返回一个FileNotFoundException,但是当我检查由results.PathToAssembly指示的路径时,程序集确实在那里。然而,我不能确定它在那个特定时刻。
我重新启动该服务,一切都回到正轨。
有什么明显的原因要做到这一点?
思考,这可能是一些权限问题我试图在已经创建的组件,并设置文件只读重现该问题,但引起编译失败的原因。
当结果=正在查找指定程序集的路径时,偶然会发生轻微的权限问题。也可以在代码中释放或处理新创建的对象..如果在导致此特定错误时可能存在某些缓存问题,我会发现它。 – MethodMan 2012-01-04 19:24:47
为什么要设置'parameters.OutputAssembly'参数。 GenerateExecutable == false'? – 2012-01-04 20:16:53
@ M.Babcock我想你的意思是parameters.GenerateInMemory = true。这是个好问题。 OutputAssembly正在设置,因为我们需要程序集(实际的文件)。我没有编写代码,因此我不知道GenerateInMemory部分。 – 2012-01-04 22:59:23