- Używam Visual Studio 2005. Zapoznałem się z programem .NET Reflector.
Wiadomo, że w pliku EXE, w odróżnieniu od EXEków wygenerowanych w innych kompilatorach, nie ma kodu maszynowego (bezpośrednie przetłumaczenie kodu ASM na ciąg bitów), natomiast jest kod pośredni, który kompiluje się do kodu maszynowego dopiero w momencie każdorazowego uruchamiania programu. Ponadto podobno (proszę poprawić, jak się mylę) przy uruchamianiu EXE stworzonego pod .NET nie kompiluje się cały od razu, tylko kompiluje się fragmentami w momencie np. pierwszego wywoływania określonej procedury w programie (kompilacja "just in time").
Fakt, że w pliku EXE jest kod pośredni powoduje, że w programie .NET Reflector można odtworzyć wszystkie metody i wyglądają one prawie tak, jak jak napisałem w kodzie źródłowym.
Czy na podstawie pliku EXE dla .NET można odtworzyć projekt odczytywalny w Visual Studio? Oczywiście wiadomo, że przy kompilacji pewne elementy kodu mogą być utracone przy kompilacji w ramach optymalizacji kodu, ale .NET Reflector pokazał, że można niemalże odtworzyć pierwotną postać metod. Do tego musiałoby być odtwarzanie innych elementów, jak formularze, zasoby. Czy istnieje program, który na to pozwala?
-
Wspomniany fakt, że kompilacja następuje w trakcie pracy programu, obniża wydajność programu. A skoro następuje kompilacja w locie, to czy istnieje możliwość, żeby na podstawie pliku EXE wygenerowanego z Ms Visual Studio (lub innego kompilatora obsługującego .NET) wygenerować "zwyczajny" plik EXE z kodem maszynowym dla Windows. Wtedy (przynajmniej teoretycznie) wydajność pracy programu (szczególnie takiego, który wykonuje duże ilości obliczeń) powinna wzrosnąć. Na jednych zajęciach badałem wydajność Javy i .NET przez pomiar czasu wielokrotnego wykonywania algorytmu identycznego w obu przypadkach (algorytmy takie jak sortowanie, obliczanie ciągu Fibonacciego), test wykazał, że ten sam algorytm w Javie może wykonywać się prawie 2 razy szybciej.
-
Wiem, że .NET jest opisany w Wikipedii, ale tam potrafią być błędy merytoryczne, więc zapytam.
Nie słyszałem, żeby opracowano .NET na inne systemy niż Microsoft Windows. Bo w przypadku Javy cel jest jeden: Umożliwienie uruchamiania skompilowanego programu na różnych platformach. Gdyby .NET był opracowywany również dla Linux, MacOs i innych, to powód też byłby znany i ten sam, co Java.
Jeżeli nie wieloplatformowość, to jaki był cel stworzenia i korzystania z .NET? -
Wiem, że w odpowiedzi na brak .NET dla innych systemów niż Windows powstał projekt Mono. Teoretycznie Mono ma być kompatybilny z .NET 2.0 (ponoć w praktyce z tym bywa różnie). Czy żaby uruchomić program dla .NET w Linuxie z zainstalowanym MONO, to czy trzeba dysponować plikiem binarnym, czy kodem źródłowym danego programu dla .NET?