| Termin | Definicja |
|---|---|
| Environment.GetEnvironmentVariable() zwraca null |
Wywołanie Environment.GetEnvironmentVariable() zwraca null — na czym polega problemZmienne środowiskowe są parami złożonymi z nazwy i wartości tekstowej. Mogą przechowywać między innymi ścieżki, tryby pracy aplikacji, identyfikatory środowiska lub parametry konfiguracyjne. W .NET wartość odczytuje się zwykle za pomocą metody Najprostsze wywołanie wygląda następująco: Istotne jest to, że brak wyniku nie pozwala samodzielnie rozstrzygnąć, czy zmienna nie istnieje, czy tylko nie znajduje się w oczekiwanym zakresie. W systemie Windows można mieć zmienną ustawioną dla konkretnego konta użytkownika, dla całego systemu albo wyłącznie dla pojedynczego procesu. Kod uruchomiony w aplikacji widzi przede wszystkim środowisko odziedziczone w momencie startu procesu. Późniejsza zmiana ustawień systemowych nie musi więc od razu pojawić się w już działającym programie. W przypadku przeciążenia przyjmującego nazwę i zakres można jawnie określić źródło odczytu: Warto pamiętać, że Zakres Process, User i Machine w praktyce .NETZakres procesu jest tymczasowy i powstaje przy uruchomieniu programu. Jeżeli zmienna zostanie ustawiona wyłącznie w terminalu, będzie dostępna dla poleceń uruchamianych z tego terminala oraz dla procesów, które odziedziczą jego środowisko. Nie będzie natomiast automatycznie widoczna w innym oknie konsoli, w aplikacji uruchomionej z eksploratora plików ani w programie działającym już wcześniej. Zakres użytkownika jest powiązany z konkretnym kontem systemowym. Zmienna ustawiona dla jednego użytkownika nie musi być dostępna po zalogowaniu na inne konto. Znaczenie ma również sposób uruchomienia programu. Aplikacja startująca w kontekście innego konta, zadania systemowego lub usługi może otrzymać zupełnie inny zestaw zmiennych niż aplikacja uruchomiona ręcznie. Zakres komputera obejmuje ustawienia systemowe, ale odczyt nie zawsze przebiega tak samo w każdej konfiguracji. Wartość może zostać zmieniona po uruchomieniu aplikacji, a działający proces nadal będzie posługiwał się wcześniejszym środowiskiem. Z tego powodu po dodaniu lub zmianie zmiennej należy ponownie uruchomić program, a czasem również narzędzie, które ten program uruchamia. W kodzie bezpieczniej jest jawnie opisać oczekiwane zachowanie: Nie należy zakładać, że zmienna ustawiona w profilu użytkownika będzie dostępna dla każdego sposobu uruchomienia aplikacji. Środowisko IDE, terminal, menedżer testów, skrypt budowania i uruchomienie pliku wykonywalnego mogą przekazywać odmienne wartości. Różnice pojawiają się także między konfiguracją lokalną a wdrożeniową, dlatego konfiguracja powinna być sprawdzana w tym samym kontekście, w którym faktycznie działa aplikacja. Typowe przyczyny zwracania wartości nullNajczęstszym powodem jest niezgodność nazwy. Nazwa zmiennej jest tekstem i nawet drobna różnica, taka jak dodatkowa spacja, inny znak podkreślenia, literówka albo pomylony separator, może spowodować brak dopasowania. Przy diagnozowaniu warto skopiować nazwę bezpośrednio z konfiguracji i porównać ją z argumentem przekazywanym do metody. Drugą przyczyną jest ustawienie wartości w niewłaściwym miejscu. Zmienna utworzona w jednym terminalu może nie pojawić się w procesie uruchomionym przez IDE. Podobnie wartość dodana do ustawień użytkownika nie musi być widoczna w procesie uruchomionym z odmiennymi uprawnieniami lub pod innym kontem. W takiej sytuacji należy sprawdzić zarówno nazwę, jak i właściciela oraz zakres zmiennej. Problem może również wynikać z kolejności działań. Jeżeli zmienna zostanie dodana po uruchomieniu aplikacji, aktualnie działający proces zwykle nie otrzyma jej automatycznie. Ponowne wywołanie W projektach .NET częstym źródłem nieporozumień jest także różnica między ustawieniami uruchomieniowymi a rzeczywistymi zmiennymi systemowymi. Konfiguracja profilu debugowania może przekazywać wartości tylko podczas startu z określonego środowiska. Uruchomienie programu poza tym środowiskiem nie musi korzystać z tych samych ustawień. Podobne objawy występują, gdy kod zakłada, że zmienna zawsze istnieje: Operator Do sprawdzenia problemu przydatne jest tymczasowe wypisanie nazwy, zakresu i informacji o tym, czy wartość istnieje. Nie powinno się jednak logować haseł, tokenów, kluczy ani innych poufnych danych przechowywanych w zmiennych środowiskowych. Jeżeli zmienna może zawierać dane wrażliwe, należy ograniczyć diagnostykę do informacji typu „ustawiona” lub „brak”, bez ujawniania treści. Kiedy najlepiej skorzystać z pomocy serwisu - Environment.GetEnvironmentVariable() zwraca nullDo serwisu warto zgłosić problem, gdy Przed przekazaniem urządzenia warto przygotować nazwę zmiennej, informację o sposobie uruchamiania programu oraz opis momentu, w którym pojawia się Podczas diagnostyki można kolejno sprawdzić dokładną pisownię nazwy, odczyt dla Najważniejsza zasada polega na traktowaniu |