2012-03-05 15 views
5

Jaka jest różnica między użytecznością DllImport tutaj? W szczególności, czy "user32" oznacza po prostu "user32.dll", czy to znaczy "user32.lib" czy coś innego?DllImport user32 vs user32.dll

[DllImport("user32")] 
protected static extern int GetKeyboardState(byte[] pbKeyState); 

[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] 
protected static extern short GetKeyState(int vKey); 

Prawdopodobnie możesz zignorować CharSet i CallingConvention.

Jeśli są takie same, mogę przepisać to, aby było bardziej spójne, ale jeśli nie, nie chcę mieć z tym problemów.

+0

[Tutaj jest strona MSDN na konstruktorze] (http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.dllimportattribute.dllimportattribute.aspx) w celach informacyjnych. – Guvante

+0

Odpowiednią dokumentacją jest dokumentacja [LoadLibrary] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms684175 (v = vs.85) .aspx). * Jeśli ciąg znaków określa nazwę modułu bez ścieżki, a rozszerzenie nazwy pliku zostanie pominięte, funkcja doda domyślne rozszerzenie biblioteki .dll do nazwy modułu. Aby uniemożliwić dodanie funkcji .dll do nazwy modułu, należy dodać znak końca kropki (.) W łańcuchu nazwy modułu. * –

Odpowiedz

11

W tym przykładzie nie ma różnicy. Rozszerzenie .dll zostanie automatycznie dołączone do "user32", aby utworzyć "user32.dll". Jednak nie zawsze tak jest. Jeśli nazwa pliku biblioteki zawiera kropkę, rozszerzenie .dll zostanie automatycznie dołączone jako , a nie.

Kilka przykładów:

[DllImport("user32")] -> postanawia "USER32.DLL". Poprawny.

[DllImport("user32.dll")] -> Rozwiązuje "User32.dll". Poprawny.

[DllImport("mylib.version5")] -> Rozwiązuje "mylib.version5". Niepoprawnie

[DllImport("mylib.version5.dll")] -> Rozwiązuje "mylib.version5.dll". Poprawny.

+0

Wygląda na to, że w implementacji Mono .NET okresy w nazwie biblioteki nie zapobiegają automatycznemu dołączaniu rozszerzenia. (Przynajmniej w wersji Mono używanej w Unity 4.5.1, która moim zdaniem jest odmianą Mono 3.0.) – yoyo

+0

+1 dla "okresu w nazwie pliku biblioteki", godzinami drapałem się po głowie (jest raczej oczywiste). – helmesjo

1

W systemie Windows nie ma różnicy, import zostanie pomyślnie wykonany, jeśli pominięto rozszerzenie. Zwykle pomijanie rozszerzenia jest pożądane podczas uruchamiania Mono w sekcji konfiguracji <dllmap>, gdzie środowisko wykonawcze P/Invoke będzie szukać aliasów.

Powiązane problemy