2009-03-10 23 views
10

Mam aplikację C#, która używa biblioteki dll. Kiedy próbuję uruchomić aplikację, nie może znaleźć biblioteki dll, chyba że znajduje się w tym samym katalogu lub w GAC. Nie chcę mieć go w tym samym katalogu i nie chcę go instalować w GAC. Czy jest jakiś sposób, aby powiedzieć aplikacji, gdzie szukać biblioteki? (Na przykład, jeśli chcę rozpowszechniać aplikację do klientów i chcą korzystać z własnych aplikacji, które będą korzystać z dll).Jak ustawić ścieżkę biblioteki C# dla aplikacji?

Dodano:

Chciałbym mieć taką strukturę plików:

Folder główny: biblioteki, Aplikacje

biblioteki: lib.dll

Applications: app1.exe

I don” t chcesz skopiować go do GAC lub mieć lib.dll w folderze Aplikacje. Czy to możliwe?

+0

Tamara, istnieje również możliwość edycji poprzedniego pytania. To byłby preferowany sposób. –

+0

Tamara, to pytanie jest bardzo podobne do tego: http://stackoverflow.com/questions/629459/c-cannot-find-library-during-runtime –

Odpowiedz

6
+0

Czy to w zasadzie to samo co kopiowanie do GAC? –

+0

Nie, są one koncepcyjnie różne. Można nawet przekierować zespół zainstalowany w GAC do innej wersji za pomocą tej metody. Musisz edytować konfigurację maszyny lub umieścić bibliotekę DLL w podkatalogu. Wątpię, by którykolwiek z nich był tym, czego chcesz, ale jak zauważyli GvS i Jon, nie jest to dobra rzecz w ogóle. –

0

Jak powiedziałem w mojej odpowiedzi na poprzednie pytanie:

Zastosowanie Assembly Redirection instrukcje twojej app.config lub machine.config.

8

Zalecam, aby aplikacje klientów kopiować dll, których używają w swoim własnym katalogu.

VB6 używany do dzielenia dll między aplikacjami, mamy termin dla tego: DLL Hell

+0

+1 Świetna odpowiedź! Muszę przegłosować! –

+0

Proszę użyć bardziej nowoczesnego terminu dla "DLL Hell" ---> The Global Assembly Cache. =) Myślę, że MS oznaczało dobrze ("Droga do piekła jest ...") kiedy zrobili GAC, ale czuje się jak ten sam stary ból ... dziwność aplikacji, brakujące funkcje, dodatkowe kroki wdrażania, itp. – StingyJack

1

DLL będzie musiała być w GAC lub w katalogu aplikacji lub podkatalogu, jako odpowiedzi na swoje wcześniejsze pytanie powiedziany.

Jeśli Twoi klienci chcą pisać własne aplikacje za pomocą DLL, powinieneś zainstalować go w GAC lub poprosić o skopiowanie biblioteki DLL. Posiadanie wielu kopii biblioteki nie brzmi tak jak dobra rzecz, ale tak naprawdę jest: oznacza to, że możesz uaktualnić jedną kopię do innej wersji bez niszczenia wszystkiego.

0

Użytkownik może się logować, a następnie wyświetlać działania, które frakcja podjęła próbując załadować zespół. To sprawia, że ​​diagnozowanie błędów związanych z ładowaniem zespołu jest bardzo łatwe.

Narzędzie do zrobienia obu to "FUSLOGVW.exe" (przeglądarka dziennika Fusion, Fusion to nazwa programu ładującego) i zawarte w pakiecie SDK.

4

W swoim głównym:

AppDomain.CurrentDomain.AssemblyResolve += (s,e)=>{ 
    var filename = new AssemblyName(e.Name).Name; 
    var path = string.format(@"C:\path\to\assembly\{0}.dll", filename); 
    return Assembly.LoadFrom(path); 
}; 

Dodaj jakiś wyjątek obsługi do

+0

Dzięki ; w moim przypadku nasi użytkownicy instalują SDK konkretnego produktu i wiemy z grubsza, gdzie znajduje się biblioteka. Obsługa zdarzeń AssemblyResolve była dokładnie tym, czego potrzebowałem. – Epu

1

Jest to możliwe bez GAC, ale zespoły muszą być silne nazwie i trzeba wprowadzić zmiany do app.config lub gdy wersja Zmiany publickeytoken. To właśnie mam Program główny w \, Wspólne biblioteki w \ Shared. i podprogram, który chcę oddzielić w \ SDK, używa .. \ Shared dla złożeń.

<runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <probing privatePath="shared" /> 
     <dependentAssembly> 
     <assemblyIdentity name="protobuf-net" publicKeyToken="257b51d87d2e4d67" /> 
     <codeBase version="1.0.0.282" href="../protobuf-net.dll"/> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="SevenUpdate.Base" publicKeyToken="5d1aea1de74f122c" /> 
     <codeBase version="11.5.4.0" href="../SevenUpdate.Base.dll"/> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="SharpBits.Base" publicKeyToken="5d1aea1de74f122c" /> 
     <codeBase version="11.5.5.0" href="../SharpBits.Base.dll"/> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="System.Windows" publicKeyToken="5d1aea1de74f122c" /> 
     <codeBase version="11.5.5.0" href="../System.Windows.dll"/> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="WPFLocalizeExtension" publicKeyToken="5d1aea1de74f122c" /> 
     <codeBase version="11.5.5.0" href="../WPFLocalizeExtension.dll"/> 
     </dependentAssembly> 
    </assemblyBinding> 
    </runtime> 
Powiązane problemy