[C#] Solution i dll ładowane z innego katalogu

0

W małym wstępie opiszę delikatnie o co chodzi.

Mianowicie mam rozwiązanie w którym mam kilka projektów i m.in. biblioteki dll. Po skompilowaniu programu, wszystkie biblioteki ładują się do tego samego katalogu, w którym generuje się plik .exe
Projekt jest duży i mam tych bibliotek ponad 50, więc chciałbym je podzielić tematycznie w katalogach mniej więcej tak:

Bin

  • .exe
    Dll
  • temat1
    • dll1.dll
    • dll2.dll
  • temat2
    • dll1.dll

Przy okazji dodam, że z przyczyn ode mnie niezależnych ładowanie dynamiczne odpada.
Czekam na jakieś pomysły ;)

0

A odpal plik .sln i zobacz, czy nie ma tam tych informacji.

0
mnatanek napisał(a)

W małym wstępie opiszę delikatnie o co chodzi.

Mianowicie mam rozwiązanie w którym mam kilka projektów i m.in. biblioteki dll. Po skompilowaniu programu, wszystkie biblioteki ładują się do tego samego katalogu, w którym generuje się plik .exe
Projekt jest duży i mam tych bibliotek ponad 50, więc chciałbym je podzielić tematycznie w katalogach mniej więcej tak:

Bin

  • .exe
    Dll
  • temat1
    • dll1.dll
    • dll2.dll
  • temat2
    • dll1.dll

Przy okazji dodam, że z przyczyn ode mnie niezależnych ładowanie dynamiczne odpada.
Czekam na jakieś pomysły ;)

zależne assembly ładują się pewnie dlatego, że nie są podpisane (strong-signed) i traktowane są jako private assemblies. Jeśli jednak podpisane ich i zainstalowanie w GACu Ci nie odpowiada i chciałbyś je trzymać jako private assemblies i w konkretnych katalogach to prawdopodobnie da się to załatwić przez odpowiedni appconfig.xml dla Twojej aplikacji - jeśli dobrze pamiętam to trzeba poustawiać to w sekcji runtime poprzez assemblyBinding i codeBase.
Przypuszczam że to rozwiązanie nie zadziała spod VS - w tym sensie, że VS będzie kopiowało przy buildzie private assemblies oznaczone jako referencje do projektu.

0

Przypuszczam że to rozwiązanie nie zadziała spod VS - w tym sensie, że VS będzie kopiowało przy buildzie private assemblies oznaczone jako referencje do projektu.

Od tego jest Post-build event - po prostu skopiujesz dll'ki do odpowiednich podkatalogow.
Tez mi sie wydaje, ze plik konfiguracyjny zalatwi sprawe :)

0

config.xml też niestety odpada z mojego rozwiązania. Duży problem w tym, że mam nałożone dość spore ograniczenia, ale co do Post-build event to rozpoczynam poszukiwania ;)

Poszukiwania ok.
Tyle, że jakąkolwiek wpisze komendę otrzymuję błąd:

Error 1 The command "tutaj polecenie" exited with code 1.

A wpisałem: Copy $(TargetPath) C:\

Co jest nie tak? Wyczytałem w sieci, że w VS2003 był pewien bug, który źle działał z kopiowaniem plików, ale ja posiadam 2005 Proffesional Edition

A teraz wpisałem: Copy "$(TargetPath)" "C:"
i poszło

Dzięki Wam podzielenie się wiedzą

0

Trochę się pospieszyłem...

Ładnie wszystko skopiowało, ale to co jest w nowym katalogu nie uruchamia się tak jak należy. Od razu chce wysyłać raport do Microsoft'u. Po debugowaniu dostaję informację, ze biblioteka nie może zostać znaleziona.

0

no tak, bo jeszcze trzeba je odpowiednio zlinkowac, a do tego wlasnie mial Ci sluzyc plik configuracyjny :) app.config :P Czemu on u Ciebie odpada?

Mozna jeszcze by napisac maly wraper na aplikacje, ktory na starcie laduje odpowiednie assembly skad chcesz, a pozniej przechodzi do wykonywania juz glownego kodu... (dodatkowa klasa, ktora jako pierwsza odpalisz po main'nie.

Poki co innych pomyslow nie mam. Tak gdzies w glowie mi swita tez, ze jakos skadu mozna bylo ustawic katalog z ktorego maja byc ladowane assembly (inny niz GAC), jednak nie moge obecnie nic na ten temat znalezc, a i czasu pobawic sie nie mam...

0

Odpadał bo takie dostałem założenia do projektu.

Udało mi się jednak to wynegocjować, więc aplikacja może śmigać. A możesz coś o tym linkowaniu powiedzieć więcej? Albo nie wiem czego dokładnie szukać albo google czasem zawodzi :/

0

Witam
Skoro możesz podpiąć app.config to rozwiązanie jest proste

<configuration>
   <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
         <probing privatePath="bin;bin2\subbin;bin3"/>
      </assemblyBinding>
   </runtime>
</configuration>

pozdrawiam

0

No tak, z tego co rozumiem mam dostęp do katalogów wewnętrznych, a jak wyjść na zewnątrz?

w html byłoby to np tak "../Dll"

0
mnatanek napisał(a)

w html byłoby to np tak "../Dll"

to nie zadziała:)

Można spróbowac jeszcze użyć sekcji <codeBase>, ale tam trzeba podłączać każdą dll'kę z osobna.
http://msdn2.microsoft.com/en-US/library/4191fzwb.aspx
pozdrawiam

0

Hehe, wiem że nie zadziała, chciałem tylko kodem zobrazować o co mi dokładnie chodzi, bo niektórzy programiści lepiej radzą sobie z czymś takim niż z językiem polskim ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1