2012-07-10 22 views
5

Castle.Core'u içeren bir FakeItEasy sürümü oluşturmaya çalışıyorum. ILMerge hakkında okudum ve ihtiyacım olan çözüm gibi görünüyordu. Download ve FakeItEasy inşa ettikten sonra ben gerekli tüm dosyaları (FakeItEasy.dll (.NET4), Castle.Core.dll (.NET4), ilmerge.exe, FakeItEasy.snk) aynı klasöre kopyaladı. Sonra aşağıdaki komutu çalıştırılmadan:ILMerge throwing exception ile imzalı kitaplık oluşturma

ilmerge 
    /keyfile:FakeItEasy.snk 
    /out:..\FakeItEasy.dll 
    /t:library 
    /targetplatform:v4,C:\Windows\Microsoft.NET\Framework\v4.0.30319 
    FakeItEasy.dll Castle.Core.dll 

Ve aşağıdaki sonuç var: Ben birleştirilmiş montaj gayet oluşturulur "/keyfile:FakeItEasy.snk" yazmayan varsa

An exception occurred during merging:                
An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B)                         
    at System.Compiler.Writer.MscorsnStrongNameSignatureGeneration(String wszFilePath, String wszKeyContainer, Byte[] pbKeyBlob, Int32 cbKeyBlob, IntPtr ppbSignatureBlob, IntPtr pcbSignatureBlob) 
    at System.Compiler.Writer.WritePE(String location, Boolean writeDebugSymbols, Module module, Boolean delaySign, String keyFileName, String keyName)            
    at System.Compiler.Writer.WritePE(CompilerParameters compilerParameters, Module module)   
    at ILMerging.ILMerge.Merge()                 
    at ILMerging.ILMerge.Main(String[] args) 

, ama bu imzalı bir versiyona ihtiyacım olduğu için bana yardım etmiyor.

Ben de hedef platform belirten denedim:

/targetplatform:v4,C:\Windows\Microsoft.NET\Framework64\v4.0.30319 

fakat sonuçlar aynıydı.

+1

Hey, aynı sorunu yaşadığım için buna bir cevap buldunuz mu? – Confused

+0

Hiç bir zaman anlamadı. NuGet aracılığıyla dağıtılan FakeItEasy sürümünü kullanarak sona erdi, böylece sorun gitti. –

+0

Benim için çalışan bir geçici çözüm, 64 bit yerine 32 bit modunda çalışmasını sağlamak için "corflags ilmerge/32bitreq +/force" idi. – jnm2

cevap

2

Son zamanlarda, Windows 8 64-bit çalıştıran yeni bir makinede bir proje oluştururken bu soruna girdim. Daha önce bir Windows 7 32-bit sanal makinede geliştiriyordum ve bir sorunum yoktu. ILMerge komutu, post-build olayı olarak çalıştırılıyor. Visual Studio, 32-bit bir süreç olduğundan, aynı zamanda, post-build olayında kullanılan aynı ILMerge komutunu kullanarak Windows 8 64-bit makinede bir 32-bit Visual Studio Komut İstemi davranışı çoğaltmak mümkün oldu.

ILMerge.exe 
    /keyfile:public.snk 
    /targetplatform:"v4,C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0" 
    /t:exe 
    /ndebug 
    /out:Result.exe Source.exe Other.dll 

Ben .NET uygulamalarını ve yerli C++ kütüphaneleri arabirim çalışma adil bir miktar yaptık, bu yüzden istisna mesajla An attempt was made to load a program with an incorrect format. çok aşina olduğum Bu BITNESS sorununa işaret eder nerede, örneğin, 32 bit işlem bir 64 bit kitaplığı yüklemeye çalışır. Bu kesin durum, burada olduğuna inanıyorum. Bu 64 bitlik bir makine olduğundan, 64 bit Visual Studio Komut İstemi'nde ILMerge komutunu da denedim. İlginç bir şekilde, ama tamamen şaşırtıcı olmayan bir şekilde, 32-bit isteminde istisna oluşturan aynı komut, 64-bit isteminde iyi çalışır.

Gelişme sırasında yalnızca ortak anahtar bilgisi içeren bir snk dosyası kullanıyorum, bu nedenle birleştirilen derlemeyi imzalamayı geciktiriyorum. Daha sonra ILMerge için mevcut komut anahtarlarına baktım ve /delaysign anahtarını keşfettim. Bu anahtarı ILMerge komutuna eklemek, ILMerge'i 32 bit işlemden çalıştırırken sorunu giderir. daha da ilginç nedir

ILMerge.exe 
    /keyfile:public.snk 
    /delaysign 
    /targetplatform:"v4,C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0" 
    /t:exe 
    /ndebug 
    /out:Result.exe Source.exe Other.dll 

tam açık/gizli anahtar çifti ile bir snk dosyasını kullanırken, ILMerge komutu /delaysign anahtarı olmadan da gayet iyi çalışmasıdır. Bu nedenle, yalnızca genel anahtar bilgisine sahip bir snk dosyası kullanıldığında ve ILMerge 32 bit işlemden başlatıldığında istisnanın oluştuğu anlaşılmaktadır.

0

VS 2013'ten VS 2015'e geçtiğimde bu hatayı almaya başladım ve her zaman iyi yapılmış bir proje oluşturmaya çalıştım (ILMerge, yapının parçası olarak yürütülür). Yukarıdaki cevap bana özel anahtarların yönetici erişimi gerektirdiğini hatırlattı. Sonra yeni VS 2015 kısayolumun "Yönetici olarak çalıştır" olarak ayarlanmadığını hatırladım. Bir kez VS 2015'i bir yönetici olarak yeniden başlattığımda, ILMerge parçasının yapısı iyi çalıştı.