2011-02-10 14 views
8

Jak poprawnie odwołać się do biblioteki DLL C#, do której nie mam dostępu fizycznego? (I rzeczywiście DLL, po prostu nie wszystkie jego zależności.)Jak mogę używać biblioteki dll C# (managed), której nie mam?

Tło:

Na komputerze docelowym jest program i wiele współzależnych dll zainstalowane w C:\FancyProgram.

Potrzebuję napisać prostą aplikację, która zostanie wdrożona na komputerze docelowym do C:\SimpleProgram.

Ten prosty program będzie musiał wykonać połączenia do jednego z plików dll pod numerem C:\FancyProgram. Jest to plik DLL zarządzany na platformie .net

Na mojej maszynie programistycznej mam , a nie kopię FancyProgram. Mam ten jeden plik DLL, ale nie mam żadnej z jego wielu zależności. Nie mogę również dołączyć tej biblioteki do SimpleProgram.

Jaka jest poprawna metoda używania i odwoływania się do tej biblioteki DLL w moim projekcie Visual Studio, tak aby mój plik SimpleProgram poprawnie się skompilował, ale załadował bibliotekę DLL w środowisku wykonawczym z właściwej lokalizacji?

Dziękuję

+2

Zarządzana (.NET) lub niezarządzana biblioteka dll? –

+0

Zarządzane. (zaktualizowane .Dziękuję.) – nonot1

+0

Z poprawnej lokalizacji również będzie problem w zarządzanym przypadku, ponieważ z C: \ SmpleProgram nie załaduje się dll z C: \ FancyProgram. Czy też zależności są GAC-ed? Nigdy nie próbowałem, jeśli dowiązanie symboliczne zadziała (Taa: http://weblogs.asp.net/israelio/archive/2011/01/10/how-to-overcome-the-clr-fusion-limitation.aspx) – rene

Odpowiedz

0

Uhhhh, co zamierzasz zrobić testy? Zakładając, że wiesz, że musisz upewnić się, że plik .dll znajduje się w GAC i odsyła go w ten sposób (najlepiej), to znaczy, że .dll musi znajdować się w tym samym miejscu na wszystkich komputerach. Dodaj .dll w swoich referencjach i oznacz go jako Kopiuj lokalnie: false, więc nie wdrażasz go. Powodzenia.

+0

Testowanie zostanie przeprowadzone na maszynie docelowej. (To tylko mała część kodu). Biblioteka DLL będzie znajdować się w dokładnie określonej lokalizacji na wszystkich komputerach docelowych. Jak mogę powiedzieć programowi, aby załadował go w czasie wykonywania z określonej lokalizacji? – nonot1

+0

Wiedząc o tym, poszedłbym z sugestią zihotki. – RobertG5

1

Czasami warto spojrzeć na szczegóły LoadLibrary, GetProcAddress i Marshal.GetDelegateForFunctionPointer.

Chciałbym również zbudować bibliotekę dll do testowania lokalnie, z tym samym interfejsem, co zewnętrzna biblioteka dll. To, ile funkcji włożymy, zależy od złożoności interfejsu i twojego SimpleProgram.

Było kilka doskonałych odpowiedzi na mój stary question o importowanie zewnętrznych bibliotek dll.

3

. Netto i tak zrobi późniejsze wiązanie. Dopóki nie odwołasz się do pliku .dll w żaden sposób, dopóki nie będziesz chciał go załadować, to zadziała.

Po prostu zamknij wszystkie odniesienia (pola, właściwości, metody, instancje) w klasę spearate lub w projekcie i wykonaj instancję tylko wtedy, gdy musisz. Następnie możesz spróbować złapać błąd ładowania. Zobacz okno wyjściowe Visual Studio, gdy aplikacja jest uruchomiona, powie ci, kiedy próbuje załadować plik .dll.

Można też spojrzeć na te wydarzenia, aby Twoje błędy app uchwyt wdzięcznie:

AppDomain.CurrentDomain.AssemblyLoad += ...; 
AppDomain.CurrentDomain.AssemblyResolve += ...; 
AppDomain.CurrentDomain.UnhandledException += ...; 
AppDomain.CurrentDomain.FirstChanceException += ...;

Można też wziąć podejście MEF. Jest to struktura do robienia późnego ładowania/wiązania.

Powiązane problemy