我正在用CodeDom创建新的.cs文件,以后想用CSharpCodeProvider编译/运行它们,但引用有问题。
代码如下:
var provider = new CSharpCodeProvider();
var compilerparams = new CompilerParameters(
new[]
{
"First.dll",
"Second.dll"
})
{
GenerateExecutable = false,
GenerateInMemory = true
};
CompilerResults results = provider.CompileAssemblyFromFile(compilerparams, _path);
if (!results.Errors.HasErrors)
return results.CompiledAssembly;
var errors = new StringBuilder("Compiler Errors :rn");
foreach (CompilerError error in results.Errors)
{
errors.AppendFormat("Line {0},{1}t: {2}n",
error.Line, error.Column, error.ErrorText);
}
throw new Exception(errors.ToString());
"First.dll"one_answers"Second.dll"与我生成的.cs文件存在于同一文件夹中,如果我直接运行它,就会出现错误。如果我把它们移到我的项目bin目录中,效果很好,但我宁愿把它们分开。
是否可以为"First.dll"one_answers"Second.dll"设置绝对路径,或者为包含我所有引用的目录设置路径,而不是将它们移动到我的bin目录?
我试图将CompilerParameters更改为绝对路径,但没有帮助。
我找到了一个新的解决方案来解决这个问题。我设置了一个输出路径并返回这个路径,而不是在内存中生成。所以以后当我想使用它时,我会用Assembly.LoadFrom()加载它(它将使用同一目录中所有引用的dll)。
示例代码,
如何生成程序集:
public string CompileCode()
{
var provider = new CSharpCodeProvider();
var outputPath = Path.Combine(Path.GetDirectoryName(_path), "temp.dll");
var compilerparams = new CompilerParameters(
new[]
{
@"D:pathtoreferenceddll",
@"D:pathtoreferenceddll2"
}, outputPath);
CompilerResults results = provider.CompileAssemblyFromFile(compilerparams, _path);
var i = results.PathToAssembly;
if (!results.Errors.HasErrors)
return i;
var errors = new StringBuilder("Compiler Errors :rn");
foreach (CompilerError error in results.Errors)
{
errors.AppendFormat("Line {0},{1}t: {2}n",
error.Line, error.Column, error.ErrorText);
}
throw new Exception(errors.ToString());
}
加载它:
Assembly assembly = Assembly.LoadFrom(path);
//Do stuff with assembly