จะรวมหลาย ๆ ชุดเข้าด้วยกันได้อย่างไร?


87

ฉันใช้กองซ้อนบริการของฉันโดยใช้โปรเจ็กต์ EXE (งานเริ่มต้นสำหรับแอปพลิเคชัน azure) ซึ่งฉันได้คัดลอก DLL ของกองบริการและ DLL ของ Azure บางส่วนไปยังโครงการ EXE

dlls

เมื่อฉันสร้างโปรเจ็กต์ EXE นี้ Azure DLL จะถูกรวมเข้ากับ EXE ของฉัน แต่ DLL ของกองบริการจะไม่รวมกับ EXE เนื่องจากในการเรียกใช้ EXE ของฉันบนเครื่องใด ๆ ฉันต้องคัดลอก DLL ของกองบริการทั้งหมดด้วยตนเอง

ฉันใช้ dll ของกองบริการนี้เพื่อใช้

JsonServiceClient client = new JsonServiceClient(servicepath);

ฉันต้องทำอย่างไรเพื่อรวม DLL เหล่านี้ทั้งหมดเข้ากับ EXE ของฉัน

คำตอบ:


120

คุณมีหลายทางเลือก:

หรือ

  • ใช้เครื่องมือบางอย่างเช่นSmartAssembly (เชิงพาณิชย์)
    ซึ่งสามารถฝังและรวมเข้ากับสิ่งอื่น ๆ ได้ (ไม่จำเป็นต้องเปลี่ยนซอร์สโค้ดของคุณ)

หรือ

  • รหัสที่ตัวเองมีน้อยกว่า 10 บรรทัด (ฟรี แต่เปลี่ยนซอร์สโค้ดน้อยที่สุด)
    ทำเครื่องหมายการอ้างอิงที่จำเป็นทั้งหมดเป็น "ทรัพยากรในตัว" - วิธีนี้จะรวมอยู่ในไฟล์ EXE ... คุณต้องตั้งค่าAssemblyResolveตัวจัดการที่รันไทม์อ่านจากทรัพยากร และส่งคืน DLL ที่จำเป็นไปยังรันไทม์. NET ...

4
ขอบคุณที่เตือนฉันเกี่ยวกับการแก้ปัญหาการประกอบของ Jeffrey Richter! ดูคำตอบของฉันเกี่ยวกับCosturaสำหรับเครื่องมือที่รวมสิ่งนี้เข้ากับการฉีดรหัสที่จำเป็น
CodeFox

29

เครื่องมือที่คุณกำลังมองหาที่เรียกว่าILMerge เป็นเครื่องมือบรรทัดคำสั่งและสามารถใช้งานได้ดังนี้:

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

นอกจากนี้ยังมีบทความที่อธิบายถึงวิธีการรวม ILMerge ไว้ในการตั้งค่าโครงการ VS ของคุณที่นี่


สวัสดีฉันสามารถเพิ่มทรัพยากรภายนอก (ไฟล์ / รูปภาพ) ลงในปฏิบัติการได้หรือไม่
Emdadul Sawon

@EmdadulSawon คุณอาจรวมไว้เป็นทรัพยากรใน libs ของคุณได้หรือไม่?
Alexander

27

เครื่องมือที่ยอดเยี่ยมในการรวมแอสเซมบลีที่อ้างอิงเป็นทรัพยากรแบบฝังคือCostura (ส่วนเสริมFody ) ผู้เขียน Simon Kropp อธิบายไว้ดังนี้:

[... ] การรวมกันของสองวิธี:

ผลลัพธ์ที่ได้คือวิธีแก้ปัญหาที่ง่ายสุด ๆ ซึ่งต้องการเพียงแค่ดึงCostura ร่างจาก NuGet

คุณสมบัติ:

  • รวมถึงสัญลักษณ์การดีบัก
  • การบีบอัดของชุดประกอบแบบฝัง
  • รวม / ไม่รวมชุดประกอบเฉพาะ
  • อื่น ๆ (ดูReadme )

9
OMG Costura ร่างกายคือคำตอบที่ถูกต้อง ติดตั้งแพคเกจจาก nuget สร้างโครงการขึ้นมาใหม่และตอนนี้ฉันมี EXE AWESOME แบบสแตนด์อโลน !!
Eric Labashosky

4
ไม่อยากจะเชื่อเลยว่ามันง่ายแค่ไหน เพียงติดตั้งแพ็คเกจจาก nuget เท่านี้ก็เสร็จแล้ว
iraSenthil

2
ฉันใช้ Costura.Fody เช่นกัน การตั้งค่าเป็นเรื่องเล็กน้อยและง่ายมากที่จะรวมแพ็คเกจ NuGet เป็นทรัพยากร รับโครงการ
Michael Silver

1
@ user3700562 เทคนิคนี้ไม่ได้สร้างแอสเซมบลีใหม่ แต่เป็นการรวมแอสเซมบลีที่อ้างอิงอย่างน้อยหนึ่งชุดลงในแอสเซมบลีที่มีอยู่
CodeFox

1
ทางออกที่ดี! ฉันใช้มันมาตั้งแต่ปีและไม่มีปัญหา แต่โปรดทราบว่ารวมเฉพาะแอสเซมบลีที่อ้างถึงโดยโปรเจ็กต์ยอดนิยมของคุณเท่านั้น หากแอปของคุณอ้างอิงโปรเจ็กต์อื่นที่อ้างอิงแอสเซมบลีของบุคคลที่สามคุณจะต้องเพิ่มโปรเจ็กต์นั้นในโปรเจ็กต์ระดับบนสุดของคุณ
Demir

7

ลองILMerge-GUI การควบรวมกิจการสุทธิ เป็น GUI Ilmergeซึ่งหลีกเลี่ยงการทำงานในบรรทัดคำสั่งทั้งหมด


2
สุดยอด! ทำงานได้ดีสำหรับฉัน!
Alex Pelletier

1
Codeplex กำลังปิดตัวลงดังนั้นนี่คือลิงค์โครงการที่ย้าย: bitbucket.org/wvd-vegt/ilmergegui
Hegi

3

หากคุณมีการพึ่งพา WPF ตัวเลือกของคุณอาจมี จำกัด มากกว่านี้ ..... ILMerge ดูเหมือนจะไม่จัดการกับสิ่งเหล่านี้ Costura.Fody (ตามที่ Codefox กล่าวไว้ข้างต้น) ทำงานได้อย่างสมบูรณ์แบบสำหรับเราและใช้เวลาประมาณ 5 นาทีในการเดินทาง ... เป็นประสบการณ์ที่ดีมาก

ติดตั้งด้วย Nuget (เลือกโปรเจ็กต์เริ่มต้นที่ถูกต้องใน Package Manager Console)

มันรวม DLL ทั้งหมดที่มีเครื่องหมาย "Copy Local" = true และสร้างไฟล์. EXE ที่ผสาน (ควบคู่ไปกับเอาต์พุตมาตรฐานซึ่งส่วนใหญ่ไม่จำเป็นในขณะนี้) ซึ่งจะถูกบีบอัดด้วย จากนั้นสามารถใช้แบบสแตนด์อโลนได้

ใบอนุญาตคือ MIT เพื่อให้คุณสามารถแก้ไข / แจกจ่ายได้ตามต้องการ

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


2

ชำระเงินโปรเจ็กต์ServiceStack.Gapซึ่งแสดงตัวอย่างต่างๆของวิธีการ ILMerge ServiceStack ใน. exeข้ามแพลตฟอร์มเดียว

ServiceStack ยังมีคุณสมบัติอื่น ๆ อีกมากมายที่เหมาะอย่างยิ่งสำหรับการสร้างแอพฝังตัวเหล่านี้โดยที่:

  • อนุญาตให้บริการของคุณโฮสต์เองโดยใช้ HTTP Listener ของ. NET
  • รองรับมุมมอง Razor ที่คอมไพล์ไว้ล่วงหน้า
  • รองรับทรัพยากรในตัว
  • รองรับฐานข้อมูลแบบฝังใน Sqlite และ OrmLite
  • สามารถเป็น ILMerged เป็น. exe ไฟล์เดียว

2

.net core 3 แนะนำตัวเลือกใหม่สองตัวเลือกในการกำหนดค่าโครงการซึ่งเรียกว่าการเผยแพร่และการตัดแต่งไฟล์เดียว

คุณสามารถดูรายละเอียดเพิ่มเติมเกี่ยวกับเอกสารได้ที่นี่การกำหนดค่าโครงการคัดลอกที่นี่เพื่อใช้อ้างอิง

  1. การกำหนดค่าโครงการ:
    <PropertyGroup>
      <RuntimeIdentifier>win10-x64</RuntimeIdentifier>
      <PublishSingleFile>true</PublishSingleFile>
    </PropertyGroup>

    <PropertyGroup>
      <PublishTrimmed>true</PublishTrimmed>
    </PropertyGroup>
  1. ใช้ CLI:
    dotnet publish -r win10-x64 -p:PublishSingleFile=true
    dotnet publish -r <rid> -c Release

ได้รับการสนับสนุนอย่างเต็มที่ในการรวมสองตัวเลือกเข้าด้วยกันเพื่อให้ได้ชุดประกอบเดียวที่ถูกตัดแต่งสำหรับแอปพลิเคชันของคุณ


2
สิ่งนี้ไม่ได้หมายความว่าคุณเป็นชุดประกอบเดียว เพียงแค่บีบอัดไฟล์ของคุณลงในไฟล์ zip แล้วแตกไฟล์ลงในโฟลเดอร์ผู้ใช้เมื่อคุณพยายามเรียกใช้แอปพลิเคชัน
Jesper
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.