2012-01-04 2 views
1

EnvironmentVariables в ProcessStartInfo.EnvironmentVariables (тип StringDictionary) всегда устанавливаются в нижний регистр, когда я что-то вставляю в него. Например:C# System.Diagnostics.ProcessStartInfo EnvironmentVariables не зависит от регистра?

proc.StartInfo.EnvironmentVariables.Clear(); 
proc.StartInfo.EnvironmentVariables.Add("REDIRECT_STATUS", ""); 
// [snipped more variables being added here] 
proc.Start(); 

В процессе там сейчас является redirect_status, а не REDIRECT_STATUS, как я хотел. Это вызывает проблемы.

Я уже где-то читал, что вы можете обойти эту проблему, создав пакетный файл, однако это не применимо в моем случае, поскольку это предназначено для использования в качестве CGI (этот код можно было бы назвать 10 раз второй.)

Есть ли способ получить EnvironmentVariables, чтобы не быть чувствительным к регистру, и просто позвольте мне пойти на все шапки?

ответ

2

Хм, обратите внимание всем, кто также сталкивается с этой проблемой: очевидно, это a bug in .Net 3.5 и исправлено в 4.0.

Мне пришлось переключиться на .Net 4.0, чтобы решить эту проблему.

1

Переменные среды в Windows не чувствительны к регистру. Поведение этой переменной явно основано на этом факте. Если вы используете переменные среды в среде Windows, это не должно вызывать проблем. Вы не упомянули, на какой платформе это работает - это приложение Mono, работающее на Unix-подобной системе?

+1

Это приложение Windows, однако, применение Я называю CGI PHP, где, если вы запрашиваете $ _SERVER ['SOMETHING'], он учитывает регистр. – Codecat

+0

У вас есть контроль над PHP-скриптом? Если это так, замените $ _SERVER ['FOO'] на getenv ('FOO'), если комментарии в http://php.net/manual/en/function.getenv.php верны. –

+0

Я хочу, чтобы все виды скриптов работали, поэтому в верхних шапках нужны переменные окружения. Спасибо за подсказку getenv. Не знал этого. – Codecat

1

Я столкнулся с той же проблемой и нашел этот вопрос. Не желая обновлять проект до .Net 4, я нашел следующее обходное решение. Это решение зависит от внутренней реализации StringDictionary класса, и делать так часто считается плохой практикой, но она получает работу на .Net-...

System.Reflection.FieldInfo contentsField = typeof(System.Collections.Specialized.StringDictionary).GetField("contents", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic); 
System.Collections.Hashtable envtable = (System.Collections.Hashtable)contentsField.GetValue(proc.StartInfo.EnvironmentVariables); 
envtable.Add("REDIRECT_STATUS", ""); 
+0

Отличный ответ, если вы не можете перейти на .Net 4. Ответ для меня был обновлен, но вы получаете мое повышение независимо от того. Ницца! – Codecat

Смежные вопросы