Autor Wątek: [C#] Import funkcji biblioteki DLL napisanej w C++  (Przeczytany 3658 razy)

Offline Lavi

  • Użytkownik
    • using namspace <Lavi.h>

# Lipiec 08, 2011, 16:06:29
Witam,

Mam problem z importem funkcji z bibliotek DLL które stworzyłem w C++. Próbowałem różnych kombinacji importowania funkcji z plików DLL i nadal mam błąd mówiący że nie może odnaleźć funkcji.

Kod:
[DllImport("Lavgine.dll", EntryPoint = "InitExternal", ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
static extern void InitExternal(IntPtr Ptr);

[DllImport("Lavgine.dll", EntryPoint = "Loop", ExactSpelling = false)]
static extern void Loop();

Błąd:
Cytuj
EntryPointNotFoundException
W bibliotece DLL 'Lavgine.dll' nie można znaleźć punktu wejścia o nazwie 'InitExternal'.

Funkcja w DLL'ce:
Cytuj
void __stdcall InitExternal(void *)
_Loop@0

Import funkcji z systemowych DLL'ek działa bez problemu. Z tego co wyczytałem na necie DLL'ki te są napisane w czystym C który nie "dekoruje" nazw funkcji i da się je bez większych problemów importować. Co do funkcji C++ znalazłem różne teksty traktujące to w różny sposób ale niestety nie działają lub ja robię coś źle.

Zastanawiam się czy czasem funkcji DLL nie mam też źle wyeksportowanych :/

Typowy eksport funkcji, obiektów i klas C++:
__declspec(dllexport) void __stdcall Init(void* ExternalRC);
struct __declspec(dllexport) L_sKeyState;

Z góry dziękuje za wszelką pomoc.

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline kubera

  • Użytkownik
    • Prywatna strona

# Lipiec 08, 2011, 16:25:34
Witam!

Jeżeli funkcja jest twoja, to sprawdź, pliz, czy ją poprawnie eksportujesz.
Możesz np. użyć Module definition.

Offline Minus

  • Użytkownik

# Lipiec 08, 2011, 16:35:09
Z tego co wyczytałem na necie DLL'ki te są napisane w czystym C który nie "dekoruje" nazw funkcji i da się je bez większych problemów importować.
W twoim przypadku nazwy są 'dekorowane', ponieważ nie wstawiłeś przed deklaracją funkcji:
extern "C"

Offline Lavi

  • Użytkownik
    • using namspace <Lavi.h>

# Lipiec 08, 2011, 16:54:48
Dzięki za szybką odpowiedź :)

DLL Exporter Viewer zmylił mnie podają mi już niedekorowane nazwy funkcji. Dopiero w Dependency Walker'ze znalazłem dekorowane nazwy funkcji i wszystko działa cacy.

Z extern "C" również się pobawie :) Chciałem po prostu na początek przetestować czy to działa.

Mam takie jeszcze jedno pytanie jak sprawa się ma z strukturami i klasami ?
Bo np. w C++'ie muszę dostarczyć pliki *.H i LIB żeby ktoś mógł używać ich używać.

Czy w C# też muszę zbudować odpowiedniki C++'owych struktur i klas ?

Offline msieradzki

  • Użytkownik

# Lipiec 08, 2011, 16:57:46

Offline ArekBal

  • Użytkownik

# Lipiec 08, 2011, 19:11:45
I jak sie przekonasz, nie jest to takie proste. :)