niedziela, grudnia 27, 2009

C# miewa swoje plusy ;-)

Taka krótka notka ;-)
Jak nie znoszę .NET i C# to jednak w jednym jest na pewno wygodniejsze w użyciu niż Java.
Chodzi o użycie natywnego kodu.
Pisałem tu już o tym kiedyś, ale nadal tak uważam, a ostatnio się o tym znów przekonałem.

Chcąc sprawdzić jak .NET/C# zachowują się gdy kod natywny jest 32 bitowy, a wszystko działa w 64 bitowym .NETcie zrobiłem sobie prostą DLLkę, której najistotniejszy kod wyglądał tak:
DLLIMPORT void HelloWorld ()
{
MessageBox (0, "Hello World from DLL!\n", "Hi", MB_ICONINFORMATION);
}

A jego użycie w C# tak:
 [DllImport("Project1.dll")]
static extern void HelloWorld();

static void Main(string[] args) {
HelloWorld();


I to wszystko [przy okazji, 64 bitowy .NET tak jak i 64 bitowa Java nie jest w stanie użyć 32 bitowego natywnego kodu :-)].

A w Java'ie przez JNI? Toż to za skarby świata tak łatwe by być nie mogło. Po pierwsze musiałbym zawołać tą całą HelloWorld() z jakiejś metody która miałaby odpowiednie modyfikatory i nazwę, coś a'la kod z Nowego Gadacza:
JNIEXPORT void JNICALL Java_pl_przemelek_gadacz_tts_DDE_speakViaDDE
(JNIEnv *, jobject, jint, jstring);

Czyli w JNI to koszmarek.

Trzeba jednak zaznaczyć, że w JNA byłoby to chyba prostsze, ale że godzina już nie młoda to jakoś nie mam ochoty na konfigurowanie środowiska i ściąganie JARów dla JNA :-)

Inna sprawa, że kodu natywnego się powinno unikać. Nie tylko przywiązuje do wybranego systemu operacyjnego, ale nawet do danej jego platformy sprzętowej [w Windows x86 nie użyjesz kodu x64, a w x64 nie użyjesz kodu x86, w Linuksie gdzie można działać na większej ilość platform sprzętowych jest jeszcze gorzej, to samo w Solarisie i Macu].


Podobne postybeta
JNA, czyli w Java'ie też można :-)
JNI i łańcuchy ;-)
Język Go dla Windows :-)
32 bity vs. 64 bity, tym razem C++ ;-)
Pomysł - przypinajne TODO ;-)