2010-09-03 8 views
6

Muszę użyć pliku DLL C++ z witryny ASP.NET. Witryna będzie hostowana zarówno w środowiskach 32-, jak i 64-bitowych.Jak używać prawidłowego niezarządzanego pliku DLL zgodnie z architekturą procesora? (32/64 bity)

Mam wersję 32 i 64 bity niezarządzanego pliku DLL. Jak zaimportować metody z prawidłowej zgodnie z bieżącą architekturą serwera?

Podobnie jak ktoś wysłany, może to być traktowane jako problem z wdrożeniem. Moje obawy są następujące: aplikacja internetowa zużywająca ten plik DLL jest ogromna i nie mamy dokumentu wdrożenia. Nikt nie będzie pamiętał, aby wdrożyć odpowiedni plik DLL, więc staram się usunąć czynnik ludzki z roztworu :)

+0

Czy próbujesz debugować? Do czego importujesz te symbole? – linuxuser27

+0

@ linuxuser27: Nie jestem pewien, czy rozumiem twoje pytanie. Próbuję użyć biblioteki DLL w moim projekcie, zadzwoń do niektórych metod. – StackOverflower

+0

Rozumiem. Kiedy mówisz symbole, najczęściej odnosi się do wynikowego pliku PDB, który jest tworzony podczas kompilacji. Zmodyfikuję twoje pytanie, aby uniknąć tego zamieszania. Czy robisz p \ invoke w swoim kodzie .NET, aby użyć zespołu lub używasz opakowania Managed C++ do przeniesienia zespołu do projektu .NET? – linuxuser27

Odpowiedz

1

Aby uzyskać kompilatora/ramy do zrobienia większość prac trzeba

  1. mieć wiele kompilacji 'platform' (zazwyczaj x86, x64 - usunąć AnyCPU)
  2. zestaw każdej konfiguracji "Platforma docelowa" dla każdej kompilacji config
  3. dodaliśmy warunkowego symbole kompilacji __WIN32 & __X64

Lista różnych implementacji funkcji zgodnie z platformą, w tym różne nazwy dll, jeśli potrzebujesz mieć oba zainstalowane jednocześnie.

#if __WIN32 
     public delegate int Move(int target); 
     [DllImport("my.dll", SetLastError = true, CharSet = CharSet.Auto)] 
#elif __X64 
     public delegate int Move(int target); 
     [DllImport("my64.dll", SetLastError = true, CharSet = CharSet.Auto)] 
#endif 

W przeciwnym razie możesz użyć loadlib i samodzielnie zarządzać rozruchem.

+2

Zdecydowanie nie musisz się marnować. –

+1

Teraz nie masz tylko dwóch niezarządzanych bibliotek DLL, masz także dwa różne zestawy. Podwój problem. –

+0

Oczywiście, też nie podoba mi się to zbyt często, ale jest to powszechna rada, którą do tej pory znalazłem, że powinieneś zrobić specyficzny procesor, w tym na forach MSDN /. –

5

Najprostszym podejściem byłoby nadanie dwóm bibliotekom rodzimym tej samej nazwy pliku w dwóch różnych katalogach, a następnie adjust your application DLL search path w zależności od bitness.

http://www.pinvoke.net/default.aspx/kernel32.setdlldirectory

+1

W jaki sposób rozmieszczasz swoje złożenia tak, aby wywoływać tę funkcję Kernala w celu rozszerzenia ścieżki przeszukiwania biblioteki DLL przed załadowaniem złożenia wymagającego rozszerzonej ścieżki wyszukiwania? –

+0

P/invoke nie powoduje, że natywne biblioteki są wymienione w tabeli importu, gdzie program ładujący OS będzie ich szukał podczas uruchamiania. Zamiast tego wewnętrznie wywołuje 'LoadLibrary' przy pierwszym wywołaniu dowolnej metody o nazwie" [DllImport] "z tą konkretną nazwą biblioteki. Więc umieszczenie wywołania 'SetDllDirectory' w inicjatorze typu (konstruktor klasy a/k/a a/k/a konstruktor statyczny) klasy, w której deklarowane są importowane metody gwarantuje, że stanie się to zanim p/invoke spróbuje załadować bibliotekę DLL . –

+0

Kilka innych przydatnych informacji tutaj: http://www.codeproject.com/Messages/1199816/Re-Yuck.aspx –

1

Ponieważ wiemy, że nie możemy dodać niezarządzanymi pliki DLL przy użyciu dodać odniesienie. Potrzebujemy więc alternatywnego sposobu obsługi niezarządzanych plików DLLS zgodnie z architekturą CPU, która dodaje pliki DLL do katalogów projektu.

  1. Utwórz nowe foldery do projektu o nazwach x32 i x64.
  2. Skopiuj pliki DLL do tych folderów zgodnie z architekturą.
  3. Wybierz pliki i otwartych obiektów, Change „Kopiuj do katalogu wyjściowego: Copy always”
  4. Powtórz to na wszystkich plikach w obu folderach

Teraz budować swój projekt w każdej platformie, kiedy będzie zbudować projekt zarówno folder x86, jak i x64 zostaną skopiowane do folderu bin. Po uruchomieniu na serwerze będzie używać niezarządzanych plików DLL zgodnie z architekturą procesora.

Powiązane problemy