Oto sytuacja, używam biblioteki dll opartej na C w mojej aplikacji dot.NET. Istnieją 2 biblioteki dll, jeden to 32-bitowy o nazwie MyDll32.dll, a drugi to wersja 64-bitowa o nazwie MyDll64.dll.Korzystanie z biblioteki dll 32-bitowej lub 64-bitowej w C# DllImport
Istnieje zmienna statyczna przechowująca nazwę pliku DLL: ciąg DLL_FILE_NAME.
i stosuje się go w następujący sposób:
[DllImport(DLL_FILE_NAME, CallingConvention=CallingConvention.Cdecl, EntryPoint=Func1")]
private static extern int is_Func1(int var1, int var2);
Proste tak daleko.
Jak można sobie wyobrazić, oprogramowanie zostało skompilowane z włączonym "dowolnym procesorem".
Mam również następujący kod, aby określić, czy system powinien używać pliku 64-bitowego czy 32-bitowego.
#if WIN64
public const string DLL_FILE_NAME = "MyDll64.dll";
#else
public const string DLL_FILE_NAME = "MyDll32.dll";
#endif
Teraz powinien pojawić się problemy .. DLL_FILE_NAME jest określona w czasie kompilacji, a nie w czasie wykonywania więc prawo dll nie jest załadowany w zależności od kontekstu wykonania.
Jaki byłby właściwy sposób rozwiązania tego problemu? Nie chcę dwóch plików wykonawczych (jednego dla 32-bitowego, a drugiego dla 64-bitowego)? Jak mogę ustawić plik DLL_FILE_NAME przed, który jest używany w instrukcji DllImport?
Jaka jest różnica między 64 i 32 bitowymi bibliotekami DLL? Czy jest coś, czego 32-bit nie może zrobić na 64? Jeśli tak, po prostu użyłbym 32. –
W 64-bitowym systemie operacyjnym decyzja o uruchomieniu kodu w wersji 64-bitowej lub WOW64 (emulacja 32-bitowa) jest podejmowana po uruchomieniu programu. Jeśli program jest uruchamiany w trybie 32-bitowym, powinien korzystać z bibliotek bazujących na C, które zostały skompilowane odpowiednio w wersji 32-bitowej i 64-bitowej. – Gilad
Jeśli naprawdę chcesz to zrobić, będziesz musiał ominąć atrybut 'DllImport' i załadować bibliotekę DLL ręcznie, korzystając z funkcji' LoadLibrary', 'GetProcAddess' i' FreeLibrary'. Ta technika jest omawiana [tutaj] (http://stackoverflow.com/questions/2818011/set-dllimport-attribute-dynamicznie). To jednak spora praca i raczej łatwo się pomylić. Pozwalanie, by mechanizm P/Invoke zrobił to za Ciebie, jest o wiele łatwiejsze. Jak zauważyli inni, prawdopodobnie nie warto, jeśli można po prostu wrócić do 32-bitowej biblioteki DLL przez cały czas jako najniższy wspólny mianownik. –