将程序集的基本路径从bin目录更改为其他目录

时间:2014-05-03 11:30:47

标签: c# .net

我在 C:\ 中有一个 Test.cs 文件。此测试文件从输入文件中读取并将其写入输出文件。 test.cs中

public class Test
{
    public static int Main(string[] args)
    {
        var reader = new StreamReader("in.txt");
        string input = reader.ReadLine();
        var writer = new StreamWriter("out.txt");
        writer.WriteLine(input);
        return 0;
     }
 }

这里应该注意的是,代码只使用文件名而不是完整文件路径,这意味着该文件应该位于程序所在的目录中在跑。我在C:\

中创建了in.txt

现在,在 C:\ Project \ Runner.cs 的解决方案中有一个名为 Runner.cs 的ac#代码,动态编译 Test.cs 代码并使用反射运行它。现在,当Test.cs运行时,它希望in.txt文件位于 C:\ Project \ bin \ Debug \ in.txt 中,但它实际上存在于 C中: \ in.txt

所以,我的问题是,有没有办法让代码从C:\ in.txt获取文件,而不是从bin目录获取文件而不更改Test.cs中文件的路径< / strong>代码文件。

编辑:我很遗憾,我忘了提到为什么我需要这个要求。

Test.cs文件来自网络。我觉得编辑此文件并相应地设置文件路径不是一个好的选择。我想编译它并按原样运行它。

我希望我很清楚。如果没有,请随时询问更多信息。

1 个答案:

答案 0 :(得分:0)

如果它在您的代码切换中显示的那么简单,则CurrentDirectory适用于此示例:

var mainMembers = new CSharpCodeProvider()
    .CreateCompiler()
    .CompileAssemblyFromSource(
        new CompilerParameters { GenerateInMemory = true }
        , @"
        using System; 
        using System.IO;
        public class M {
            public static int Main() { 
                Console.WriteLine(""CurDir = ""+ Environment.CurrentDirectory); 
                var reader = new StreamReader(""in.txt"");
                string input = reader.ReadLine();
                var writer = new StreamWriter(""out.txt"");
                writer.WriteLine(input);
                return 0;
            }
        }")
     .CompiledAssembly
     .GetType("M")
     .GetMember("Main");
 // inspect
 Environment.CurrentDirectory.Dump("current");
 // keep 
 var oldcd = Environment.CurrentDirectory;
 // switch
 Environment.CurrentDirectory = "c:\\temp";
 // invoke external code
 ((MethodInfo) mainMembers[0]).Invoke(null,null);
 // restore
 Environment.CurrentDirectory = oldcd;

在多线程场景中,这变得不可靠。