2010-07-30 38 views
10

Đối với cuộc sống của tôi, tôi dường như không thể ứng dụng .NET 4 của tôi hợp nhất đúng với ILMerge. Ngay cả sau khi thiết lập/targetplatform,/lib,/ndebug thêm tệp ILMerge.exe.config tùy chỉnh, tệp đầu ra không hoạt động đúng (có vẻ như không thể tìm thấy "các thư viện đã hợp nhất).Sự cố nghiêm trọng với ILMerge và .NET 4.0

Tôi đã thử thisthis không có kết quả. Tôi thậm chí không thể có được nó để xây dựng, trừ khi tôi sử dụng tập tin cấu hình, nhưng khi tôi làm điều đó không hoạt động. Nếu không có tệp cấu hình, tôi luôn nhận được thông báo lỗi "Tham chiếu lắp ráp chưa được giải quyết không được phép: PresentationFramework".

Dưới đây là hiện trạng của lệnh ILMerge của tôi được sử dụng như một bài đăng sự kiện xây dựng:

ilmerge.exe /out:C:\Users\Logan\Development\Projects\OrangeNote\OrangeNote\bin\Release\OrangeNote.exe 
    /ndebug /targetplatform:v4,C:\Windows\Microsoft.NET\Framework\v4.0.30319 
    /lib:"C:\Windows\Microsoft.NET\Framework\v4.0.30319" 
    /lib:"C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\PublicAssemblies" 
    "C:\Users\Logan\Development\Projects\OrangeNote\OrangeNote\obj\Release\OrangeNote.exe" 
    "C:\Users\Logan\Development\Projects\OrangeNote\OrangeNote\..\..\..\Libraries\Lucene.Net\src\Lucene.Net\bin\Release\Lucene.Net.dll" 
    "C:\Users\Logan\Development\Projects\OrangeNote\OrangeNote\..\..\..\Libraries\Ookii.Dialogs\src\Ookii.Dialogs.Wpf\bin\Release\Ookii.Dialogs.Wpf.dll" 
    "C:\Users\Logan\Development\Projects\OrangeNote\OrangeNote\..\..\..\Libraries\SharpZipLib\bin\ICSharpCode.SharpZipLib.dll" 
    "C:\Users\Logan\Documents\Visual Studio 2010\Projects\HumanInterfaceProject\HumanInterfaceProject\bin\Release\HipLib.dll" 

Bất kỳ suy nghĩ về những gì tôi đang làm vậy ??

+4

Tôi giải quyết nó đơn giản bằng cách thêm: /lib:"C:\Windows\Microsoft.NET\Framework64\v4.0.30319\WPF " –

Trả lời

8

Một gợi ý mà tôi đã thấy được sử dụng để kết hợp .dll trong WPF là chỉ cần thêm dll làm tài nguyên nhúng vào dự án và sau đó tải chương trình dll vào trong assembly.

AppDomain.CurrentDomain.AssemblyResolve += (sender, args) => { 

    String resourceName = "AssemblyLoadingAndReflection." + 

     new AssemblyName(args.Name).Name + ".dll"; 

    using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName)) { 

     Byte[] assemblyData = new Byte[stream.Length]; 

     stream.Read(assemblyData, 0, assemblyData.Length); 

     return Assembly.Load(assemblyData); 

    } 

}; 

see: http://blogs.msdn.com/b/microsoft_press/archive/2010/02/03/jeffrey-richter-excerpt-2-from-clr-via-c-third-edition.aspx

+0

Điều này thật tuyệt vời, cảm ơn! Ngay cả Mike Barnett (tác giả của ILMerge) coi đây là một giải pháp, vì vậy nó đủ tốt cho tôi. :) – devios1

+1

Lưu ý rằng điều này làm cho nó không thể Ngen các tập tin dll. – Peter

+0

Thao tác này không hoạt động đối với thư viện lớp: cuộn xuống để xem nhận xét của Jeffrey Ritcher về điều này trong liên kết trong câu trả lời, nhận xét là ngày 28 tháng 7 năm 2010 3:14 tối. – Dean

3

Tôi nhận thấy rằng một trong các hội đồng của bạn được gọi là "dialogs.wpf". Hiện tại ILMerge không hợp nhất chính xác các assembly với các tài nguyên WPF trong chúng.

Không có nhiều thông tin về điều này, nhưng this forum post đề cập đến giải pháp khả thi và có một số khả năng được đề cập trên answers to this question, nhưng đề xuất bỏ phiếu cao nhất chỉ là mua một giải pháp thay thế thương mại - Tôi không biết điều đó là một khả năng cho bạn.

Có một số discussion here giải thích tại sao nó không hoạt động và có đề xuất here that changing the resource reference in the xaml may help solve the problem.

+0

Tôi không tin là có thực sự là bất kỳ tài nguyên WPF nào trong hội đồng đó, nhưng tôi không hoàn toàn chắc chắn (sẽ kiểm tra khi tôi về nhà). Thực thi chính của tôi chắc chắn, nhưng điều đó dường như không phải là vấn đề. Tuy nhiên tôi sẽ xem xét điều này hơn nữa. Cảm ơn vi đa trả lơi. – devios1

7

Tôi đã gửi email cho Mike Barnett, tác giả của ILMerge và anh ấy giải thích nó không được thiết kế để làm việc với các ứng dụng WPF, thật không may và ngạc nhiên khi tôi nói với anh ấy rằng tôi đã làm việc với ứng dụng WPF 3.5 của mình. Vì nó không thực sự được hỗ trợ, tôi sẽ chỉ viết điều này cho bây giờ và chờ một sự thay thế khác để trình bày chính nó. Là một lưu ý phụ, tôi đã thử Lò phản ứng .NET từ Eziriz, và nó thực sự hoạt động tốt, nhưng chi phí $ 180 cho một dự án sở thích mà tôi không thực sự sẵn sàng chi tiêu cho đến lúc này. Nhưng đó là một toàn bộ rẻ hơn rất nhiều so với các thay thế thương mại khác từ Red Gate và vì vậy nghĩ rằng tôi muốn đề cập đến nó.

Cập nhật: Mike Barnett giờ đây coi câu trả lời được chấp nhận cho câu hỏi này là giải pháp tốt nhất. Theo anh, nếu anh biết điều đó là có thể, anh sẽ không bao giờ viết ILMerge ngay từ đầu.

+0

Thông tin tốt. Cảm ơn vì bạn đã phản hồi. –

+0

Là một người dùng thương mại của Lò phản ứng .NET, tôi phải đề cập đến rằng tôi luôn không thể hợp nhất các hội đồng. Nó dường như đã sáp nhập thành công, nhưng khi bạn chạy ứng dụng đã hợp nhất, bạn sẽ gặp các hoạt động lạ. – Ying

+0

Dường như nó hoạt động tốt khi tôi bị kẹt * chỉ * để nhúng (không hợp nhất), và không có công cụ bảo mật ưa thích nào cả. Tôi đã làm một chương trình runthrough của tôi và tất cả mọi thứ dường như còn nguyên vẹn. – devios1

6

Trong khi đó là sự thật mà ILMerge không cập nhật chuỗi tài nguyên WPF, nó thể được sử dụng để nhập hội với sự tham khảo WPF bằng cách thông qua các thư mục lắp ráp tham khảo thay vì thư mục runtime để /targetplatform, như vậy: /targetplatform:v4,"C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\Profile\Client" (đối với Cấu hình máy khách .NET 4.0).

Tôi sử dụng tính năng này để hợp nhất trong System.Reactive.dll của Rx, có tham chiếu đến Dispatcher, nhưng không có bất kỳ tài nguyên WPF thực tế nào.

8

Bạn có thể thử Costura.

https://github.com/Fody/Costura#how-it-works

Nó cơ bản mất Jeffrey Richters appraoch

http://blogs.msdn.com/b/microsoft_press/archive/2010/02/03/jeffrey-richter-excerpt-2-from-clr-via-c-third-edition.aspx

Nhưng hiện nó trong một cách mà bạn không cần phải viết bất kỳ mã. tức là bạn không cần phải viết phương thức "AssemblyResolve"

+0

Điều này dường như có một liên kết bị hỏng. Nhưng Costura bây giờ là một NuGet Package như một add-on cho Fody. http://www.nuget.org/packages/Costura.Fody/ – Corylulu

+1

@Corylulu đã sửa – Simon

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