.NET Assemblies - pohled pod pokličku

Tomáš Jecha, MVP, MCSD       09.12.2007       C#, VB.NET, .NET       13944 zobrazení

Připravil jsem pro čtenáře VbNet.cz překlad článku od Mohammadama Azama. Je pro všechny, které zajímá co to vlastně je .NET assembly a jak jej podepsat a vložit do Global Assembly Cache.

Téma .NET Assemblies je obvykle pro začínajícího vývojáře těžký oříšek. Proto si v tomto článku popíšeme co to v .NETu assembly vůbec znamená a jaké jsou rozdíly v jednotlivých druzích.

Co to je assembly?

Assembly (česky sestavení) je balíček obsahujíc metody, pole, vlastnosti, interfacy, obrázky a mnoho dalšího. Všechny tyto entity existují v assembly v IL (Intermediate Language) formátu a jsou zkonvertovány do strojového kódu až za běhu pomocí CLR (Common Language Runtime). Assembly může existovat ve dvou podobách:

  • Portable Executable - EXE soubor
  • Dynamic Link Library - DLL soubor

Pojďme si teď uvést jednoduchý příklad, kde by se dala assembly použít. Předpokládejme, že napíšeme projekt, ve kterém máme pár metod pro aritmetické výpočty, které potřebujeme do naší aplikace. Ve výsledku pak získáme buď EXE nebo DLL soubor. To znamená, že jsme vytvořili dále použitelnou assembly, která má za účel řešit aritmetické výpočty.

Druhy Assemblies:

Máme dva druhy assemblies:

  • Weakly Named Assemblies (slabý název - nepodepsané)
  • Strongly Named Assemblies (silný název - podepsané)

Oba druhy jsou prakticky identické. Jediný rozdíl je v tom, že Strongly Named Assemblies jsou podepsané párem veřejného a privátního klíče vydavatele. Podepisování z ní udělá unikátní, zabezpečenou a verzovanou assembly. Dále si v tomto článku také ukážeme jak si můžeme podepsat vlastní assembly a jak jí uložit do GAC (Global Assembly Cache).

Pamatujte, že do GAC databáze jdou umístit jen Strongly Named Assemblies.

Nasazení Assemblies:

Nasazení můžeme provést dvěma různými způsoby, jmenovitě privátně a globálně. První způsob znamená, že assembly nahrajete do adresáře bin v aplikační složce. Globální nasazení spočívá v umístění do GAC (Global Assembly Cache). GAC obsahuje všechny assembly, které jsou s .NET dodávány. Ostatně se o tom můžete přesvědčit samy nakouknutím do složky c:\Windows\assembly. Jak už jsem psal v minulém odstavci, do GAC nelze vložit Weakly Named Assembly. Podívejte co se stane, když se o to pokusíme:

 LookIntoAssemblies1

Zpráva, která v překladu znamená "Chyba při přidávání assembly do úložny: Pokus o instalaci assembly, co nemá silné jméno." nám dává jasně na jevo, že není možné do GAC přidat weakly named assembly.

Vytváření podepsané assembly:

Abychom mohli přidat do GAC naší assembly, musíme jí podepsat. Pojďme se podívat, jak na to. První co musíme udělat je vytvořit tzv. Strong Name. To můžeme udělat pomocí nástroje SN.exe (.NET Framework Strong Name Utility). Proto zapište toto do příkazového řádku Visual Studia (naleznete ho v nabídce start):

SN.exe -k MujProjekt.keys

Tak vytvoříme soubor MujProjekt.keys obsahující privátní a veřejný klíč. V případě, že chcete vidět veřejný klíč, nechejte si ho vyextrahovat do zvláštního souboru příkazem:

SN.exe -p MujProjekt.keys MujProjekt.PublicKey

A teď zapište do okna příkazové řádky pro zobrazení veřejného klíče toto:

 LookIntoAssemblies2

Tímto způsobem pomocí SN.exe ale nemůžete zobrazovat privátní klíč. Teď, pro podepsání assembly naším vygenerovaným klíčem použijte:

vbc /keyfile:MujProjekt.keys Program.vb

Nebo pro C#:

csc /keyfile:MujProjekt.keys Program.cs

Přidání assembly se silným jménem do GAC

Teď je čas přidat naší assembly se silným jménem do Global Assembly Cache. Jednoduše spusťte GACUtil.exe:

GACUtil.exe -i Program.exe

Pokud se nyní podíváte do C:\Windows\Assembly zjistíte, že je zde i ta naše (Program.exe). Od této chvíle můžete používat assembly ve všech dalších projektech.

Závěrem

V tomto článku jsme si vysvětlili jen základy .NET assemblies. Je tu ale mnohem víc věcí, které je možné s nimi dělat. Například verzování, bezpečnost atp. A není na škodu používat nástroj ILDasm.exe, který zobrazí IL z assembly. Tímto způsobem si získáte lepší představu o tom, co se pod pokličkou .NETu vlastně děje.

Dodatek překladatele - podepisování ve Visual Studiu

I když to není účelem článku, myslím, že teď, když už máme představu o tom jak celé podepisování funguje, tak nebude na škodu si představit i "pohodlnější" cestu. Pokud ve Visual Studiu klepnete pravým tlačítkem na projekt, vyberete vlasnosti a zvolíte kartu "Signing", objeví se zaškrtávátko Sign the assembly. To nám otevře možnost zvolit podpisový klíč a nebo případně vytvořit nový. Po vykompilování bude naše assembly Strongly named a tedy i připravená pro přidání do GAC.

Toto je překlad článku z GridViewGuy.com od Mohammadama Azama, který mi ochotně dovolil jeho článek přepsat do naší mateřštiny.

 

hodnocení článku

0       Hodnotit mohou jen registrované uživatelé.

 

Mohlo by vás také zajímat

Genericita, rozhraní a dědičnost

Jazyk C# je multiparadigmatický, což v praxi znamená, že v něm můžeme dělat hodně věcí. Jak ale do sebe jednotlivá paradigma zapadají? Co se hezky doplňuje a co není vzájemně kompatibilní? V tomto článku chci popsat, jak se chová IEquatable vzhledem k dědičnosti typu T.

Windows 10 GameJam: konference a herní hackathon

ASP mvc–from zero to hero (3), vývojový stack a solution

 

 

Nový příspěvek

 

Diskuse: .NET Assemblies - pohled pod pokličku

Používám verzi Microsoft Visual Basic 2008

a pokud napíši příkaz do Command Window, tak mi vrátí toto:

>SN.exe -k MujProjekt.keys
Command "SN.exe" is not valid.

Pokud použiji klasické Start / Spustit / Cmd

tak to funguje ...

Ale potom mi to selže příkazem:

vbc /keyfile:MujProjekt.keys Program.vb

(Protože to nezadávám ve visual studiu)

Jinak jako kolega prosím o vysvětlení pro absoutní laiky

které parametry příkazů jsou volitelné, resp. se musí změnit podle našeho projektu atd ... jako

SN.exe -k JinyProjekt.keys
SN.exe -p JinyProjekt.keys JinyProjekt.PublicKey
SN.exe -tp JinyProjekt.PublicKey

Děkuji za každou radu :-D

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Příkazy pouštějte z příkazové řádky Visual Studia, tedy: Visual Studio 2008 Command Prompt

A pokud spustíte SN.EXE, tak vám do konzole příjde nápověda. Tam je popsané co je povinné a jak můžete parametry a nastavení kombinovat. Jistě pochopíte, že není v mých časových možnostech překládat celou nápovědu :-).

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Děkuji ...

Já lama jsem to hledal ve Visual studiu

a ono je to extra:

Start / Programy / Microsoft Visual studio

/ Visual studio tools / Visual studio 2008 Command Prompt

Jdu testovat ...

Díky moc :-D

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Diskuse: .NET Assemblies - pohled pod pokličku

Snažím se odstranit varování Windows XP při spuštění VB.NET aplikace po síti ("Vydavatele se nepodařilo ověřit... a dole, že neobsahuje podpis)

Podepsal jsem tedy aplikaci ve VB.NET Express (způsobem, který je tu popsaný jako druhý na konci článku), přidal do GAC. Vygenerovaný certifikát jsem úspěšně přidal do prohlížečů obou počítačů. Nic se nezměnilo.

Zkusil jsem tedy způsob zde podrobně rozepsaný, ale ztroskotal jsem. Mám podle návodu vygerovaný klíč, ale neumím s ním aplikaci podesat. V návodu je:

Tímto způsobem pomocí SN.exe ale nemůžete zobrazovat privátní klíč. Teď, pro podepsání assembly naším vygenerovaným klíčem použijte:

vbc /keyfile:MujProjekt.keys Program.vb

Co je (která část projektu) "Program.vb" ?

Ať zkusím podepsat aplikaci (formulářovou) v EXE nebo třeba AssemblyInfo.vb (soubor jménem aplikace s typem .vb nemám) dostanu chybové hlášení:

> vbc : error BC30420: 'Sub Main' was not found in 'AssemblyInfo'

Když zkusím podepsat projekt (vytvořený ve VB.NET 2008 Express), tak je chyb příliš:

> vbc : error BC30041: Maximum number of errors has been exceeded

Prosím o radu.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Za parametry musíte uvést všechny soubory s kódem projektu. Ostatní nastavení projektu se musí dodávat přímo parametrům kompilátoru. To dělá i spouštěč kompilátoru ve Visual Studiu. Zkuste začít u něčeho jednoduššího, třeba u jednoho VB souboru:

public module mod1

  sub main()
    Console.WriteLine("Ahoj")
  end sub

end module

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.

Nyní zakládáte pod článkem nové diskusní vlákno.
Pokud chcete reagovat na jiný příspěvek, klikněte na tlačítko "Odpovědět" u některého diskusního příspěvku.

Nyní odpovídáte na příspěvek pod článkem. Nebo chcete raději založit nové vlákno?

 

  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback