2009-08-05 13 views
8

W jaki sposób są rozwiązywane złożenia w .NET. Mam na myśli, jak rozwiązuje się zespół z pełną nazwą. Nie mam pojęcia o tokenach kluczy publicznych/prywatnych i silnym nazewnictwie. DziękiJak rozwiązano złożenie w .NET?

EDYCJA: Przeczytałem również o opóźnionym podpisywaniu i tym podobne. Czy ludzie naprawdę go używają? (Czy ktoś faktycznie korzystał z podpisywania opóźnień) Kto generuje klucz do podpisania zgromadzenia. Przykro mi, jeśli zadaję zbyt wiele pytań. Ale jestem zdezorientowany tym wszystkim.

Odpowiedz

14

Silne nazewnictwo jest używane wraz z "tokenem klucza publicznego" do utworzenia pełnej nazwy wyświetlania (mscorlib, version=2.0.0.0, Culture=neutral, PublicKeyToken=b4778,.....). Dzięki temu możemy mieć wiele wersji tego samego zestawu obok siebie w tym samym katalogu aplikacji.

Token klucza publicznego (a tym samym technika określania ciągów znaków) pozwala również programowi ładującemu .NET wykryć, czy ktoś zmodyfikował zawartość złożenia od czasu jego rozprowadzenia. Jest to prawdą, ponieważ gdy podpisujesz zestaw za pomocą "tokena prywatnego", kompilator wygeneruje wartość skrótu, którą osadza w metadanych zestawu, która opisuje publiczną część twojego "tokena prywatnego". Program ładujący może następnie użyć tej wartości, aby określić, czy zestaw został zmodyfikowany.

Odnośnie zespoły rozdzielające, istnieje kilka podstawowych rzeczy do rozważenia:

  • Sondowanie Ładowarka próbuje zlokalizować zespoły wykorzystaniem podstawowego katalogu „sondowanie” techniki. Oznacza to, że spróbuje zlokalizować "MyAssembly.dll" (na przykład) w katalogu startowym aplikacji, jeśli nie, to w podkatalogach poniżej. Jeśli sondowanie nie uda się zlokalizować "MyAssembly.dll", zdarzenie AppDomain 'AssemblyResolve zostanie wyrzucone.

  • Konfiguracja maszyny/Użytkownik/systemu machine.config, user.config i system.config są pliki konfiguracyjne przechowywane lokalnie w systemie, który można wykorzystać do zmiany zachowania rezolwerem montażu na „maszyna”, „user” lub ustawienie "system" w całym systemie.

  • Polityka Wydawca Można użyć „<assemblyIdentity>” xml token w pliku konfiguracyjnego aplikacji (na przykład „MyApp.exe.config”), aby wskazać rezolwer do pewnej wersji zespołu lub załadować montaż od A inna lokalizacja.

  • rozdzielczości niestandardowe chwytać "AssemblyResolve" wydarzenie AppDomain. To zdarzenie jest wywoływane, gdy zespół nie może być rozwiązany przez „tradycyjnych” metod

zdecydowanie najmniej skomplikowany mechanizm jest obsłużyć „AssemblyResolve” zdarzenie.

Podsumowując, program rozpoznawania nazw wygląda w bieżącym katalogu lub pamięci podręcznej zespołu globalnego, przetwarza zasady, a następnie w końcu umożliwia niestandardową rozdzielczość.

+0

"pozwala programowi ładującemu .NET wykryć, czy ktoś zmodyfikował zawartość zespołu ...". –

+2

Pewnie. Zasadniczo podczas kompilowania zestawu z silną nazwą wartości skrótu (można również użyć narzędzia wiersza poleceń sn.exe), wartość mieszania zostanie zapisana w metadanych zespołu, który opisuje jego wersję, kulturę, nazwę i wartość tokena. Po załadowaniu zestawu przez moduł ładujący sprawdza on, czy w zespole znajduje się token klucza publicznego, a jeśli tak, uruchamia ten sam algorytm mieszania w zespole, porównuje go z tym, co znajduje się w metadanych zestawu, i odmawia załadowania złożenia, jeśli się różnią. W ten sposób załadowany wykrywa "manipulowanie". Jest bardzo ograniczony, jak widać, ale na razie wystarczający. –

+0

Na pierwszy rzut oka wygląda to na sposób ochrony naszego kodu .NET. Ale, niestety, podniecenie szybko mija i wkrótce uświadomicie sobie, że obfuskacja to kolejna najlepsza rzecz. –

1

Rozdzielanie zespołów może obejmować wiele kroków, w zależności od tego, gdzie zespół, który próbuje załadować, jest (GAC, folder podstawowy aplikacji, podkatalogi lub inny folder poza podstawowym folderem aplikacji).

To jest dobry artykuł o tym, jak określić, gdzie .Net szuka twoich złożeń. MSDN Article

Jeśli chcesz runtime rozwiązać zespół, który nie jest zapisany w folderze bazowej aplikacji lub GAC następnie trzeba będzie rejestrować zdarzenia AppDomain, która jest podniesiona, gdy nie może znaleźć montaż. Następnie zareagowałbyś na to zdarzenie, sprawdzając, czy plik istnieje w twojej innej lokalizacji, a następnie zwróci go za pomocą Assembly.LoadFrom (thePath).

Wystarczy dodać do tej odpowiedzi dalej jest to pękanie link, który należy zsumować cały silne nazewnictwa z kluczami bardzo ładnie dla ciebie: Strong Naming - keys etc..

Wszelkie pytania od tego, po prostu zapytaj!

+0

Kto generuje klucz do podpisania zgromadzenia? –

2

Poniższy artykuł na MSDN powinno pomóc: rozdzielczość

http://msdn.microsoft.com/en-us/library/yx7xezcf(VS.71).aspx

Assembly w .NET może być dość skomplikowane, jak zespoły mogą znajdować się w różnych miejscach w tym GAC, umieszczone w tym z wykonywanie montażu, kopiowanie w tle itp. Ogólny proces nazywany jest procesem Fusion i zapewnia, że ​​odpowiednie zabezpieczenia są spełnione podczas ładowania złożeń.

Powiązane problemy