可以在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 :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

相关内容

  • 没有找到相关文章

最新更新