Làm thế nào để hợp nhất nhiều cụm thành một?


87

Tôi sử dụng ngăn xếp dịch vụ của mình bằng cách sử dụng dự án EXE (tác vụ khởi động cho ứng dụng azure) trong đó tôi đã sao chép DLL của ngăn xếp dịch vụ sau đây và một số DLL của Azure vào dự án EXE.

dlls

Khi tôi xây dựng dự án EXE này thì Azure DLL sẽ được đóng gói với EXE của tôi nhưng DLL của ngăn xếp dịch vụ sẽ không được đóng gói với EXE, vì để chạy EXE của tôi trên bất kỳ máy nào, tôi cần sao chép tất cả DLL của ngăn xếp dịch vụ theo cách thủ công.

Tôi đã sử dụng dll của ngăn xếp dịch vụ này để sử dụng

JsonServiceClient client = new JsonServiceClient(servicepath);

Tôi phải làm gì để gộp tất cả các DLL này vào EXE của mình?

Câu trả lời:


120

Bạn có một số tùy chọn:

HOẶC LÀ

  • sử dụng một số công cụ như SmartAssembly (thương mại)
    nó có thể nhúng và hợp nhất giữa những thứ khác (không cần thay đổi mã nguồn của bạn)

HOẶC LÀ

  • mã mà chính bạn trong ít hơn 10 dòng (miễn phí nhưng thay đổi mã nguồn tối thiểu)
    đánh dấu tất cả các phụ thuộc cần thiết là "tài nguyên nhúng" - theo cách này, chúng được đưa vào tệp EXE ... bạn cần thiết lập một AssemblyResolvetrình xử lý mà trong thời gian chạy sẽ đọc từ Tài nguyên và trả về các tệp DLL cần thiết cho thời gian chạy .NET ...

4
Cảm ơn vì đã nhắc tôi về giải pháp nhúng các cụm lắp ráp của Jeffrey Richter! Xem câu trả lời của tôi đề cập đến Costura để biết một công cụ kết hợp điều này với việc tiêm mã cần thiết.
CodeFox

29

Công cụ bạn đang tìm kiếm có tên là ILMerge . Nó là một công cụ dòng lệnh và có thể được sử dụng như sau:

ilmerge /target:winexe /out:MyApp.exe 
        MyExe.exe ServiceStack.dll ServiceStack.Interfaces.dll ServiceStack.ServiceInterface.dll  ServiceStack.Text.dll

Ngoài ra còn có một bài báo mô tả cách đưa ILMerge vào thiết lập dự án VS của bạn tại đây


Xin chào, tôi có thể thêm tài nguyên bên ngoài (tệp / hình ảnh) vào tệp thực thi được không?
Emdadul Sawon

@EmdadulSawon có thể bạn có thể đưa chúng làm tài nguyên vào một trong các lib của mình không?
Alexander

27

Một công cụ tuyệt vời để bao gồm các hội đồng tham chiếu làm tài nguyên nhúng là Costura (một phần bổ trợ của Fody ). Tác giả Simon Kropp mô tả nó như sau:

[...] sự kết hợp của hai phương pháp:

Kết quả là một giải pháp siêu đơn giản chỉ yêu cầu tìm nạp Costura.Fody từ NuGet.

Đặc trưng:

  • Bao gồm các ký hiệu gỡ lỗi
  • Nén các hội đồng nhúng
  • Bao gồm / không bao gồm các cụm cụ thể
  • Những người khác (xem Readme )

9
OMG Costura.Fody là câu trả lời phù hợp. Đã cài đặt gói từ nuget, xây dựng lại dự án và bây giờ tôi có một EXE AWESOME độc lập !!
Eric Labashosky

4
Tôi không thể tin rằng nó dễ dàng như thế nào. Chỉ cần cài đặt các gói từ nuget và của bạn là xong.
iraSenthil

2
Tôi cũng đang sử dụng Costura.Fody. Việc thiết lập và sử dụng các gói NuGet làm tài nguyên rất dễ dàng. Nhận dự án.
Michael Silver

1
@ user3700562, kỹ thuật này không tạo các cụm mới mà là nhúng một hoặc nhiều cụm được tham chiếu vào một cụm hiện có.
CodeFox

1
Giải pháp tuyệt vời! Tôi sử dụng nó từ một năm nay và không có vấn đề gì. Nhưng xin lưu ý rằng nó chỉ bao gồm các tập hợp được tham chiếu bởi dự án hàng đầu của bạn. Nếu ứng dụng của bạn tham chiếu đến một dự án khác tham chiếu đến assembly của bên thứ ba, bạn cần thêm nó vào dự án cấp cao nhất của mình.
Demir


3

Nếu bạn có phụ thuộc WPF, các tùy chọn của bạn có thể bị hạn chế hơn ..... ILMerge dường như không giải quyết những vấn đề này. Tuy nhiên, Costura.Fody (như Codefox đã đề cập ở trên) hoạt động hoàn hảo cho chúng tôi và mất khoảng 5 phút để bắt đầu ... một trải nghiệm rất tốt.

Cài đặt bằng Nuget (chọn đúng dự án mặc định trong Bảng điều khiển Trình quản lý Gói).

Nó hợp nhất tất cả các DLL được đánh dấu "Copy Local" = true và tạo ra .EXE được hợp nhất (cùng với đầu ra tiêu chuẩn, hầu hết bây giờ không cần thiết) cũng được nén. Điều này sau đó có thể được sử dụng độc lập.

Giấy phép là MIT để bạn có thể sửa đổi / phân phối theo yêu cầu.

https://github.com/Fody/Costura/


2

Kiểm tra dự án ServiceStack.Gap cho thấy một số ví dụ về cách ILMerge ServiceStack thành một .exe đa nền tảng .

ServiceStack cũng bao gồm một số tính năng khác đặc biệt phù hợp để tạo các ứng dụng nhúng trong đó:

  • Cho phép các dịch vụ của bạn tự lưu trữ bằng Trình xử lý HTTP của .NET
  • Hỗ trợ Chế độ xem Razor được biên dịch trước
  • Hỗ trợ tài nguyên được nhúng
  • Hỗ trợ cơ sở dữ liệu nhúng trong Sqlite và OrmLite
  • Có thể được ILMerged thành một .exe duy nhất

1

.net core 3 giới thiệu hai tùy chọn mới trong cấu hình dự án, được gọi là xuất bản và cắt bớt tệp đơn.

Bạn có thể tìm thêm thông tin chi tiết về tài liệu tại đây , cấu hình dự án sao chép tại đây để tham khảo.

  1. Cấu hình dự án:
    <PropertyGroup>
      <RuntimeIdentifier>win10-x64</RuntimeIdentifier>
      <PublishSingleFile>true</PublishSingleFile>
    </PropertyGroup>

    <PropertyGroup>
      <PublishTrimmed>true</PublishTrimmed>
    </PropertyGroup>
  1. Sử dụng CLI:
    dotnet publish -r win10-x64 -p:PublishSingleFile=true
    dotnet publish -r <rid> -c Release

Nó được hỗ trợ đầy đủ để kết hợp hai tùy chọn với nhau để có được một cụm duy nhất được cắt tỉa cho ứng dụng của bạn.


Điều này không cung cấp cho bạn là lắp ráp đơn lẻ. Nó chỉ đơn giản là nén các tệp của bạn vào một kho lưu trữ zip và sau đó giải nén nó vào một thư mục người dùng khi bạn cố gắng chạy ứng dụng.
Jesper
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.