Wykorzystanie bibliotek Javy w .Net

W trakcie przygotowań mojej pracy magisterskiej napotkałem potrzebę wykorzystania biblioteki Javy i wystawienia prostej usługi webowej z niej korzystającej. Pierwsza myśl: zrobię jakieś proste API restowe w Javie i wykonam wdrożenie na serwerze Tomcat dostępnego w Azure Market. Zacząłem się jednak zastanawiać: czy możliwym jest wykorzystać tę bibliotekę przez kod w C#? W wyszukiwarce Googla szybko uzyskałem informację o istnieniu projektu IKVM.

Kilka słów o IRKV

Jest to implementacja Javy dla Mono i .Net Framework. Projekt jest o tyle ciekawy, że umożliwia między innymi konwersję javowego bytecode do .Netowego ILa (i w drugą stronę), oraz uruchomienie aplikacji Javy w ramach .Net (i oczywiście na odwrót).

Wykorzystanie IRKV

Aby przekonwertować jar na bibliotekę .Net wykonujemy w wierszu zapytań poniższą komendę:

./irkvc some-java-lib.jar

Jeśli zostanie wykryta metoda main, wówczas archiwum jar zostanie przekonwertowany na wykonywalny plik *.exe. W przeciwnym wypadku na bibliotekę dll. Można jednak sterować konwersją przez dodatkowe parametry tj. poniżej:

./irkvc some-java-lib.jar -target:library

Aby wykorzystać wygenerowaną bibliotekę należy dodać jej referencję do swojego projektu, a także dodanie bibliotek IKVM.OpenJDK.Core, IKVM.OpenJDK.Util oraz IKVM.Runtime (np. korzystając z Nugets, bądź z pobranego folderu z projektem).

Uwaga na wykorzystanie w aplikacjach webowych

W aplikacjach webowych wątek aplikacji otwarty jest w katalogu serwera (np. dla IIS Express będzie to C:\Program Files (x86)\IIS Express). Biblioteki Javy nie korzystają z metod Server.Map(), dlatego mogą podczas wykonań powodować błędy. W razie problemów można ustawić właściwość user.dir na katalog bin naszej aplikacji.

var toSet = HttpContext.Current.Server.MapPath("~\\bin");
java.lang.System.setProperty("user.dir", toSet);

Przykład

Na moim Githubie możecie znaleźć przykład wykorzystania biblioteki morfologik-stemming w C# dzięki IKVM. Jest to proste API napisane w Nancy.
Morfologik-stemming to część polskiego projektu Morfologik. Stemming to proces wydobywania z wyrazu jego rdzenia (usuwanie końcówek fleksyjnych). O ile dla języka angielskiego łatwo znaleźć różne biblioteki pozwalające wykonać ten proces, to z narzędziami dla naszego języka jest dość ubogo. Na szczęście z pomocą przychodzi nam wspomniana biblioteka, którą możemy wykorzystać podczas analizy polskojęzycznych tekstów, np. gdy chcemy przygotować macierz częstości terminów (ang. Term Document Matrix). Wykorzystując stemming zmniejszamy wymiar macierzy i liczenie słów z tym samym rdzeniem jako jedno słowo.