我在 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文件来自网络。我觉得编辑此文件并相应地设置文件路径不是一个好的选择。我想编译它并按原样运行它。
我希望我很清楚。如果没有,请随时询问更多信息。
答案 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;
在多线程场景中,这变得不可靠。