Zbudowałem bibliotekę C++, którą chciałbym wywołać z kodu C#. Jestem w stanie wywołać jedną funkcję, ale druga rzuca wyjątek, gdy kod C# próbuje załadować bibliotekę dll.Eksportowanie funkcji z biblioteki dll C++ do C# P/Invoke
nagłówek wygląda tak: (Co robi foo = foo oznacza w polu nazwy)
extern "C" __declspec(dllexport) BOOL Install();
extern "C" __declspec(dllexport) BOOL PPPConnect();
ta produkuje dll z nieco mylące tabeli eksporcie:
File Type: DLL
Section contains the following exports for PPPManager.dll
00000000 characteristics
499F44F0 time date stamp Fri Feb 20 16:04:00 2009
0.00 version
1 ordinal base
2 number of functions
2 number of names
ordinal hint RVA name
1 0 000078E4 Install = Install
2 1 000079DC PPPConnect = PPPConnect
Moja P/Wywołania invoke wyglądają tak:
[DllImport("PPPManager.dll")]
private static extern bool Install();
[DllImport("PPPManager.dll")]
private static extern bool PPPConnect();
Wywołanie Instalatora zwraca się bez wyjątku, ale gdy zadzwonię do PPPConnec t, dostaję MissingMethodException - "Nie mogę znaleźć punktu wejścia" PPPConnect "w bibliotece DLL" PInvoke "PPPManager.dll."
Próbowałem usunąć dyrektywy extern i declspec z deklaracji funkcji Install, więc PPPConnect jest jedyną funkcją eksportowaną, a to nadal nie pozwala mi wywoływać PPPConnect.
Próbowałem również zrobić DllImport przez porządkowe; daje to taki sam wynik, jak wywoływanie po nazwie - Instaluje zwroty, ale PPPConnect zgłasza wyjątek "Nie można znaleźć punktu wejścia" # 2 "...".
Dziennik współdziałanie daje:
[pinvokeimpl][preservesig]
bool invivodata.Common.System.IPAQUtils::Install();
BOOLEAN (I1_WINBOOL_VAL) Install();
JIT ERROR FOR PINVOKE METHOD (Managed -> Native):
[pinvokeimpl][preservesig]
bool invivodata.Common.System.IPAQUtils::PPPConnect();
BOOLEAN (I1_WINBOOL_VAL) PPPConnect();
Jest dobrze poza moim obszarze wiedzy, więc wszelkie sugestie lub myśli byłoby mile widziane.
Dzięki, Paul
edit: Okazuje się, że ten kod działa; Problem polegał na tym, że najnowsza biblioteka dll nie była propagowana na urządzenie. D'oh!
Nigdy nie słyszałem o tym dzienniku międzyoperacyjne - w jaki sposób można włączyć/zobaczyć, że? – Charlie
http://blogs.msdn.com/netcfteam/archive/2005/07/24/442609.aspx Po prostu zacząłem go używać, aby spróbować rozwiązać ten problem, ale wydaje mi się, że zaoszczędziłoby to wiele czas debugowania MissingMethodExceptions. – Symmetric