我正在使用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 :\r\n");
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”和“Second.dll”与我生成的.cs文件存在于同一个文件夹中,如果直接运行,我会收到错误消息。如果我将它们移动到我的项目bin目录,它工作正常,但我宁愿让它们分开。
是否可以设置“First.dll”和“Second.dll”的绝对路径或包含所有引用的目录的路径,而不是将它们移动到我的bin目录?
我尝试将CompilerParameters更改为绝对路径,但这没有帮助。
答案 0 :(得分:0)
我找到了解决此问题的新解决方案。我没有在内存中生成,而是设置输出路径并返回此路径。所以稍后当我想使用它时,我使用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:\path\to\referenced\dll",
@"D:\path\to\referenced\dll2"
}, outputPath);
CompilerResults results = provider.CompileAssemblyFromFile(compilerparams, _path);
var i = results.PathToAssembly;
if (!results.Errors.HasErrors)
return i;
var errors = new StringBuilder("Compiler Errors :\r\n");
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