Итак, я уверен, что это было задано раньше, но я не могу правильно сформулировать проблему правильно, чтобы получить какой-либо ответ.Redirect Filesystem
Что я пытаюсь сделать, это запустить приложение через C#, а затем все его вызовы на SHGetFolderPath
или Environment.GetFolder
(int .net) вернуть обратно альтернативные пути, которые я указываю.
Я попытался уже установить USERPROFILE
в качестве примера, используя ProcessStartInfo.EnvironmentalVariables
для некоторых произвольных каталогов, но это не сработало. Он установил переменную окружения USERPROFILE
на правильное значение, но вызов SHGetFolderPath
или Environment.GetFolder
по-прежнему возвращает предыдущее значение.
Любые идеи о том, как я могу получить весь путь туда?
Вот тест приложение, которое я написал для этого
class Program
{
static void Main(string[] args)
{
if (args.Any(x => x.Contains("x")))
{
// Read vars
Console.WriteLine("a=" + Environment.GetEnvironmentVariable("a"));// a=tacos
Console.WriteLine("USERPROFILE=" + Environment.GetEnvironmentVariable("USERPROFILE")); //USERPROFILE=F:\UP
Console.WriteLine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile)); // C:\Users\Username
Console.WriteLine();
var allvars = Environment.GetEnvironmentVariables();
foreach (var key in allvars.Keys)
{
Console.WriteLine("{0} - {1}", key, allvars[key]);
}
Console.WriteLine("Done Second Process");
}
else
{
// Start new process
var proc = new System.Diagnostics.ProcessStartInfo(Assembly.GetEntryAssembly().Location);
proc.Arguments = "x";
proc.EnvironmentVariables["a"] = "tacos";
proc.EnvironmentVariables["USERPROFILE"] = @"F:\UP";
proc.UseShellExecute = false;
proc.RedirectStandardInput = true;
proc.RedirectStandardOutput = true;
proc.RedirectStandardError = true;
var p = Process.Start(proc);
do
{
Thread.Sleep(10);
Console.Out.Write(p.StandardOutput.ReadToEnd());
}
while (!p.HasExited);
//catch any leftovers in redirected stdout
Console.Out.Write(p.StandardOutput.ReadToEnd());
Console.WriteLine("Any Key");
Console.ReadKey();
Console.WriteLine("Exiting...");
}
}
}
Это может быть полезно: http://www.codeproject.com/Articles/37549/CLR-Injection-Runtime-Method-Replacer – zaitsman
Я вижу, как это работает для исполняемых файлов .net, но все остальное все равно потерпит неудачу, так что это не совсем то, что я искал. –