Użycie w C# DLLki napisanej (chyba) w c++

0

Witam

Nigdy nie programowałem za pomocą bibliotek dll. Teraz mam taki własnie problem i nie potrafie sobie poradzić za pomocą materiałów z google...

Mam zbiór bibliotek (w folderze TaKIPI18) wraz z potrzebnymi danymi. Program, z którego korzystam jest napisany w c++, ja zaś pisze w c#. Jest możliwość użycia tych bibliotek?

Znalazłem przykład pliku .h

1	/*  TaKIPI 1.5
2	 *
3	 *  (c) Instytut Informatyki Stosowanej Politechniki WrocÅawskiej
4	 *  i Instytut Podstaw Informatyki PAN
5	 *  Autorzy: Grzegorz Godlewski, Adam Radziszewski, Maciej Piasecki,
6	 *  Bartosz Broda, Adam WardyÅski
7	 *
8	 *  Kod na licencji GPL.
9	 */
10	
11	#ifndef TAKIPI_DLL_API_H
12	#define TAKIPI_DLL_API_H
13	
14	__declspec(dllimport) void TaggerStart(void);
15	__declspec(dllimport) void TaggerEnd(void);
16	__declspec(dllimport) char *Tag(char const* sentence);
17	__declspec(dllimport) void SetInputEncoding(int encoding);
18	__declspec(dllimport) void FreeTaggerMemory(char * buff);
19	__declspec(dllimport) void SetDataDir(const char *dataPath);
20	
21	#endif

Dałoby się jakos przerobić ten plik .h na .cs??

0

Poczytaj o P/Invoke.

0

czy to jest moze biblioteka od tagowania czesci zdania?:) jakos tak brzmi patrzac po nazwach metod i parametrow.. jest lepsza od OpenNLP albo taggera Brill'a z '97?

a teraz do tematu:

nie jest dobrze.. przez to TAG zwracajace CHAR* ktore potem najwyrazniej musisz potraktowac FREETEAGGERMEMORY, nie za bardzo da rade uzyc klasycznego marshallingu od razu na string.. Chyba ze ktos z Was zna jakis atrybut pozwalajacy na okreslenie procedury free'ujacej marshallowany zasob? Ja nie spotkalem sie z czyms takim.. IMHO, trzeba bedzie komunikowac sie przez IntPtr i z niego sobie samemu czytac potem do stringa :/ Inaczej nie dasz rady prawidlowo odpalic FreeTaggerMemory i jesli sprobujesz odmarshallowac od razu do string'a, program bedzie gubil pamiec za kazdym wywolaniem Tag()

sadze ze bezpieczne P/Invoki beda wygladaly tak:

public static class MojaKlasaOpakowujacaImportyDLL
{
    [DllImport("taKIPI.dll", CharSet=CharSet.Auto)]
    public static extern void TaggerStart();

    [DllImport("taKIPI.dll", CharSet=CharSet.Auto)]
    public static extern void TaggerEnd();

    [DllImport("taKIPI.dll", CharSet=CharSet.Auto)]
    public static extern void SetInputEncoding(int encoding);

    // pobiera string, ale sadze ze defaultowe opcje przekazywania wystarcza
    // w oryginalnym naglowku bylo const char, wiec mozna zalozyc jednostronny (IN) marshalling
    [DllImport("taKIPI.dll", CharSet=CharSet.Auto)]
    public static extern void SetDataDir([In] string dataPath);


    // problem o ktorym pisalem tyczy sie tych:
    // ta funkcja moglaby po porstu zwracac 'string' nie IntPtr, tyle ze ....
    [DllImport("taKIPI.dll", CharSet=CharSet.Auto)]
    public static extern IntPtr Tag();

    // ... ta funkcja potem chcialaby tamten wskaznik zwolnic,
    // a Ty, jesli bys powyzej odbieral jako String, to NIE DALBYS RADY
    // juz odzyskac oryginalnego wskaznika!
    [DllImport("taKIPI.dll", CharSet=CharSet.Auto)]
    public static extern void FreeTaggerMemory(IntPtr buffer);
}

i potem, oczywiscie, to co dostaniesz z Tag() bedziesz po skonczonym uzywaniu podawal do FreeTaggerMemory(), zeby zostalo zwolnione prawidlowo. Z odebraniem stringa z IntPtr poradzisz sobie?

0

Tak to jest tagger:),
Nie wiem czy jest lepszy od tych, które podałeś... nie znam innych (dopiero zaczynam się wgryzać w temat). Teoretycznie napisane jest że ma dokłądność "93.4% w odniesieniu do wszystkich tokenów w tekście oraz 86% w relacji jedynie do niejednoznacznych wyrazów." Jak na moje oko to całkiem nieźle. Jeśli chcesz się pobawić masz go na stronie: http://nlp.pwr.wroc.pl/takipi/

A co do mojego problemu z DLLkami to czuje się jak kompletny idiota - po prostu nie mogę tego zrozumieć...:(
(zawsze mogę jeszcze uruchamiać skompilowany program i otrzymywać xml'a z wynikami - tyle że to mało eleganckie rozwiązanie chyba)

Jeszcze poza tematem to jesli jesteś zainteresowany tematem analizy językowej to piszę magisterkę, gdzie tworze program do translacji z języka potocznego (polski) na SQL.. i do tego właśnie potrzebuje załaczyć tagger.

0

to co Ci podslalem to prawie ze gotowy wrapper na ta dll, ktory pozwoli Ci z niej wywolac funkcje

wklej ten kod jako nowy plik .cs do swojego projektu, kompilator bedzie sie burzyc ze nie zna [dllimport] itp. klikaj na tych napisach prawym przyciskiem, z menu kontekstowego wybierz Resolve i pododawaj sobie brakujace usingi do system.reflection czy system.interop

potem, jak juz sie skompiluje, zadbaj o to, zeby plik dll lezal kolo exeka w bin/debug/release czy gdziestam
potem sprobuj gdzies u siebie w kodzie napisac
void mojametoda()
{
MojaKlasaOpakowujacaImportyDLL.TaggerStart();
MojaKlasaOpakowujacaImportyDLL.TaggerEnd();
}
odpowiednio zmieniajac nazwe klasy czy dodajac namespacea - zaleznie jak ja u siebie umiesciles.

a nastepnie -jakos- odpal te metode, przez button, jakkolwiek.
jezeli Ci sie program nie wysypie, to znaczy ze wlasnie udalo Ci sie odpalic te dwie funkcje z tejze dll.

1 użytkowników online, w tym zalogowanych: 0, gości: 1