可以为CSharpCodeProvider中的引用设置绝对路径吗?

时间:2015-06-26 14:51:02

标签: c# dll assemblies csharpcodeprovider

我正在使用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更改为绝对路径,但这没有帮助。

1 个答案:

答案 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