CSharpCodeProvider中是否可以设置引用的绝对路径?

3

我正在使用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个回答

2
我找到了解决此问题的新方法。不再在内存中生成,而是设置输出路径并返回该路径。因此,当我想使用它时,我使用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

好主意,但唯一的问题是如果我想保持相同的负载新编译文件,AppDomain.CurrentDomain 将增加所有这些程序集。你找到了吗? - qakmak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接