Tworząc programy, bardzo często wykorzystuje się różne biblioteki stworzone przez inne osoby. Dopóki kod jest tworzony na potrzeby własne, nie patrzy się na to jak zostały przygotowane użyte biblioteki. Pierwszy momentem, kiedy zaczyna się zwracać na to uwagę jest podjecie decyzji o publikacji rozwiązania dla większego grona odbiorców. W tym momencie zaczynają się pojawiać myśli o zabezpieczeniu kodu. Najprostszym sposobem jest podpisanie plików wynikowych. I tu może pojawić się pierwszy problem. Może okazać się, że chcąc skompilować program otrzymamy następujący komunikat:

Assembly generation failed -- Referenced assembly 'Foo' does not have a strong name

Komunikat ten informuje nas, że jedna z bibliotek wykorzystywanych w naszym programie nie ma silnej nazwy (ang. strong name). Z tego powodu nie można podpisać naszych plików wynikowych. W celu rozwiązania tego problemu można zastosować trzy podejścia:

  • poprosić twórców wykorzystywanych bibliotek o przygotowanie ich podpisanej wersji,
  • znaleźć inną bibliotekę, która jest podpisana i zapewnia taką samą funkcjonalność jak używana biblioteka,
  • spróbować samodzielnie podpisać biblioteki, które nie są podpisane.

Wydaje mi się, że dwa pierwsze sposoby nie wymagają komentowania. Zajmijmy się, więc trzecim.

Pierwszym krokiem jest deasemblacja pliku biblioteki. W tym celu należy uruchomić Visual Studio Command Prompt i przejść do katalogu, w którym znajduje się problematyczna biblioteka. Teraz należy wykorzystać ildasm.exe z przełącznikami /all i /out, aby deasemblować bibliotekę. Polecenie wygląda następująco:

C:\Foo\bin> ildasm /all /out=Foo.il Foo.dll

Polecenie to wygeneruje kod biblioteki Foo w języku CIL (ang. Common Language Infrastructure). Wystarczy teraz przeprowadzić operację odwrotną – skompilować otrzymany plik. Dodatkowo w trakcie kompilacji należy podpisać bibliotekę. W tym celu należy wykorzystać narzędzie ilasm.exe, wykonując polecenie:

C:\Foo\bin> ilasm /dll /key=Key.snk Foo.il

Przed uruchomieniem tego polecenia należy przegrać do katalogu C:\Foo\bin klucz (Key.snk), którym paczka ma zostać podpisana. Do tego celu można użyć klucz, który będzie wykorzystany do podpisania naszego projektu, lub też wygenerować nowy klucz. W generacji kluczy pomaga nam Visual Studio, wystarczy wydać polecenie:

C:\Foo\bin> sn –k Key.snk

Spowoduje ono utworzenie parę kluczy publiczny – prywatny i zapisanie ich do pliku Key.snk.

Na koniec wystarczy już tylko podmienić referencje w Visual Studio, usuwając tą wskazującą na niepodpisany plik Foo.dll i dodać referencje do nowo otrzymanego podpisanego pliku. Teraz już tylko wystarczy skompilować cały projekt. Operacja ta powinna przejść bezproblemowo.

Kończąc ten temat chciałem zasygnalizować jeszcze jedną kwestię. Przed przystąpieniem do tej operacji należy sprawdzić, czy nie jest ona sprzeczna z licencją, na jakiej została wydana dana biblioteka. Z tego powodu wymienione dwa pierwsze rozwiązania są bezpieczniejsze.