2012-07-10 38 views
5

Tôi đang cố gắng tạo phiên bản được hợp nhất của FakeItEasy bao gồm Castle.Core. Tôi đọc về ILMerge và có vẻ như đó là giải pháp tôi cần. Sau khi tải xuống và xây dựng FakeItEasy tôi đã sao chép tất cả các tệp tôi cần (FakeItEasy.dll (.NET4), Castle.Core.dll (.NET4), ilmerge.exe, FakeItEasy.snk) vào cùng một thư mục. Sau đó tôi chạy lệnh sau:Tạo thư viện đã ký với ILMerge ném ngoại lệ

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

Và có kết quả sau:

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) 

Nếu tôi rời khỏi "/keyfile:FakeItEasy.snk" hội sáp nhập được tạo ra chỉ là tốt, nhưng điều đó không giúp tôi khi tôi cần một phiên bản đã ký.

Tôi cũng đã cố gắng xác định nền tảng mục tiêu như:

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

nhưng kết quả là như nhau.

+1

Xin chào, bạn có tìm thấy câu trả lời cho điều này vì tôi đang gặp phải sự cố tương tự không. – Confused

+0

Không bao giờ tìm ra. Chúng tôi đã kết thúc bằng cách sử dụng phiên bản FakeItEasy được phân phối thông qua NuGet nên vấn đề đã biến mất. –

+0

Giải pháp thay thế cho tôi là 'corflags ilmerge/32bitreq +/force' để chạy ở chế độ 32 bit thay vì 64 bit. – jnm2

Trả lời

2

Gần đây tôi đã gặp sự cố này khi thiết lập dự án trên máy mới chạy Windows 8 64 bit. Trước đây tôi đã phát triển trong một máy ảo Windows 7 32 bit và không có vấn đề gì. Lệnh ILMerge đang được chạy dưới dạng sự kiện post-build. Kể từ khi Visual Studio là một quá trình 32-bit, tôi cũng có thể tái tạo hành vi trong một 32-bit Visual Studio Command Prompt trên máy Windows 64-bit bằng cách sử dụng cùng một lệnh ILMerge được sử dụng trong sự kiện sau xây dựng.

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 

tôi đã thực hiện một số tiền hợp lý của việc giao tiếp các ứng dụng .NET và bản C++ thư viện, vì vậy tôi rất quen thuộc với thông điệp ngoại lệ An attempt was made to load a program with an incorrect format. Điều này cho thấy một vấn đề bitness nơi, ví dụ, một 32-bit quá trình cố gắng tải thư viện 64 bit. Tình huống chính xác đó là điều tôi tin đang diễn ra ở đây. Vì đây là một máy tính 64-bit, tôi cũng đã thử lệnh ILMerge trong một dấu nhắc lệnh Visual Studio 64-bit. Thật thú vị, nhưng không hoàn toàn đáng ngạc nhiên, cùng một lệnh tạo ra ngoại lệ trong lời nhắc 32 bit hoạt động tốt trong lời nhắc 64 bit.

Tôi đang sử dụng tệp snk chỉ chứa thông tin khóa công khai khi phát triển, vì vậy, tôi đang trì hoãn ký hợp đồng đã hợp nhất. Sau đó tôi xem xét các công tắc lệnh có sẵn cho ILMerge và phát hiện ra công tắc /delaysign. Việc thêm công tắc này vào lệnh ILMerge sẽ làm giảm bớt vấn đề khi chạy ILMerge từ quy trình 32 bit.

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 

gì thậm chí còn thú vị hơn nữa là khi sử dụng một tập tin snk với public/private cặp khóa đầy đủ, ILMerge lệnh làm việc tốt mà không có sự /delaysign switch. Vì vậy, nó xuất hiện rằng các ngoại lệ được tạo ra khi sử dụng một tập tin snk chỉ với thông tin khóa công khai và khi ILMerge được đưa ra từ một quá trình 32-bit.

0

Tôi bắt đầu gặp lỗi này khi tôi nâng cấp lên VS 2015 từ VS 2013 và cố gắng xây dựng một dự án luôn được xây dựng tốt (ILMerge được thực hiện như một phần của bản dựng). Câu trả lời ở trên nhắc tôi rằng khóa riêng yêu cầu quyền truy cập quản trị. Sau đó, tôi nhớ rằng phím tắt VS 2015 mới của tôi không được thiết lập để "Chạy với tư cách quản trị viên". Khi tôi khởi động lại VS 2015 với tư cách là quản trị viên, phần ILMerge của bản dựng đã hoạt động tốt.

Các vấn đề liên quan