Gadījās tā, ka vajadzēja VB.net projekta referencēs pielikt “vecu” Microsoft Excel objektu bibliotēkas versiju.
Uz mašīnas instalēta kaut kāda jaunāka office versija un attiecīgi visi atrodamie excel.dll faili vairs nav “pareizi”. Tomēr izdevās no viena cita projekta atrast jau gatavu interop.excel.dll. (Interop asamblejas ir .net videi draudzīgi “starpnieki” darbam ar COM vidi.) Diemžēl bibliotēka, kuru atradu, nebija parakstīta ar “strong name key“. Ja ir vēlme panākt, ka tava asambleja tiek parakstīta ar atslēgu, tad visām asamblejām, uz kurām tiek likta reference, jābūt parakstītām ar strong name.
Priekš tam darām pavisam vienkārši:
Dekompilējam asambleju uz Intermediate Language kodu, lietojot ildasm rīku
C:\i> ildasm interop.excel.dll /out=iexcel.il // WARNING: Created Win32 resource file iexcel.res C:\i>ren interop.excel.dll old_interop.excel.dll
Izveidojam savu atslēgas failu, lietojot sn rīku
C:\i>sn -k my.key
Kompilējam IL kodu atpakaļ uz .net baitkodu, lietojot ilasm
C:\i>ilasm /dll /res=iexcel.res /out=Interop.excel.dll /key=my.key iexcel.il
Šeit pieņemu, ildasm un ilasm rīku taka ir atrodama sistēmas PATH mainīgajā.
Pēc pirmās komandas izpildes rīks brīdina, ka ir izveidots arī resursu fails iexcel.res, kuru nevajadzētu aizmirst iekompilēt rezultējošajā asamblejā.
Rezultātā tiek iegūta jauna asambleja interop.excel.dll, kas parakstīta ar tikko izveidoto privāto/publisko atslēgu pāri my.key Šo asambleju var ievietot sistēmas GAC direktorijā un izmantot no jebkuras citas aplikācijas.
Jābrīdina, ka parakstīt svešu asambleju ar savu privāto atslēgu ir “sliktais tonis” – pirmkārt jau tādēļ, ka tādējādi tu uzņemies zināmu atbildību par sekām, kuras var atstāt koda izpilde.
Ja nepieciešams nomainīt parakstu jau parakstītai asamblejai, tad pēc dekompilācijas jāparediģē IL fails, nomainot publiskās atslēgas “token” uz savas atslēgas tokenu. Piemēram, šādi izskatās MS parakstītās bibliotēkas mscorlib tokens.
.assembly extern mscorlib
{
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 )
.ver 1:0:5000:0
}
Pēc tam atkal fails jākompilē atpakaļ uz baitkodu.
Comments are closed.