2008-09-02 62 views
16

Tôi đang làm việc trên một mô-đun cho CMS. Module này được phân phối dưới dạng một thư viện lớp DLL.Liên kết tĩnh trong C#

Tôi có một số thư viện tiện ích mà tôi muốn sử dụng trong mô-đun này. Có anyway tôi có thể liên kết các thư viện tĩnh vì vậy tôi sẽ không phải phân phối một số DLL (do đó phân phối các thư viện tiện ích của tôi một cách riêng biệt)?

Tôi muốn chỉ có một DLL.

Trả lời

23

Bạn có thể kết hợp nhiều file DLL của bạn với ILMerge:

http://research.microsoft.com/~mbarnett/ILMerge.aspx

đã không thử nó bản thân mình. Hy vọng nó giúp.


Tải ở đây:
http://www.microsoft.com/downloads/details.aspx?familyid=22914587-B4AD-4EAE-87CF-B14AE6A939B0&displaylang=en

Tóm tắt Mô tả(từ tải trang)
ILMerge là một tiện ích cho việc sáp nhập nhiều cụm NET thành một hội đồng NET duy nhất. Nó hoạt động trên các tệp thi hành và các tệp DLL giống nhau và đi kèm với một số tùy chọn để kiểm soát việc xử lý và định dạng đầu ra. Xem tài liệu đi kèm để biết chi tiết.

+1

Như Seb đã đề cập đến ILMERGE sẽ làm điều này - nhưng một cảnh báo trước là không ai trong số các hội đồng có thể chứa mã không an toàn. –

+5

Mã không an toàn là tốt. Nó sẽ không đối phó với các chế độ hỗn hợp. Loại có chứa mã không được quản lý và được tạo bởi dự án C++/CLI. –

2

Câu trả lời ngắn gọn cho điều này là không! Bạn không thể liên kết trong một dll trong khi biên dịch. Tôi không biết nếu có một số cách tinh tế để làm điều này, nhưng bạn có lẽ sẽ phải phân phối các dlls cùng với cms của bạn. Cách tốt nhất để làm điều này là làm cho một số loại phân phối lại.

+0

Không đúng sự thật. Nhìn vào câu trả lời của Kagamar. Ngoài ra nhìn vào phần bình luận cho bình luận của Mike Barnett. – Kobor42

+2

@ Kobor42: Sai, đây không phải là liên kết này là hợp nhất. Trong khi câu trả lời được trả lời nhiều nhất trả lời ý định của câu hỏi (và do đó là câu trả lời hữu ích nhất), câu trả lời của khebbie thực sự là câu trả lời đúng, miễn là người ta trả lời chính xác câu hỏi đó. Bạn thậm chí không thể liên kết một dll trong C/C++, bạn cần một kho lưu trữ tĩnh để làm điều đó ... –

+0

Thật vui khi câu trả lời này, đó là về mặt kỹ thuật chính xác không có upvotes. C# là một ngôn ngữ được quản lý, và thậm chí ILMerge là một sự hợp nhất-lắp ráp không phải là một trình liên kết. Một trình liên kết, được hiểu bởi các nhà phát triển C++ và C, hiện không thể tồn tại trong .NET như hiện tại. Tuy nhiên một công nghệ ".Net native" chưa được phát hành vào giữa năm 2015, có thể một ngày nào đó sẽ được phát hành cho phép ứng dụng được biên dịch hoàn toàn (không có MSIL), mà sau đó có thể được liên kết tĩnh. –

12

Nếu bạn không muốn sử dụng ILMerge, xem trang này:

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

biên tập của lưu ý: Jeffrey Richter lời khuyên để đưa các bạn dlls vào tập tin exe như nguồn lực (Đối với mỗi tập tin DLL bạn thêm, hiển thị các thuộc tính của nó và thay đổi “Build Action” thành “Embedded Resource.”). Sau đó, một trình nạp lớp tùy chỉnh là cần thiết để thực hiện công việc thực thi (Khi chạy, CLR sẽ không thể tìm thấy các hội đồng DLL phụ thuộc, đó là một vấn đề. Để khắc phục điều này, khi ứng dụng của bạn khởi tạo, hãy đăng ký một phương thức gọi lại với sự kiện ResolveAssembly của AppDomain).

Đảm bảo thay đổi chuỗi resourceName để trỏ đến tài nguyên thực của bạn. (ví dụ: thay đổi AssemblyLoadingAndReflection thành tên dự án của bạn.)

+1

Tốt hơn rất nhiều! Giải pháp Nativ trên công cụ của bên thứ ba. Nhìn vào phần bình luận cho nhận xét của người sáng tạo ILMerge ... – Kobor42

+2

Trong khi điều này có thêm một chút nỗ lực, điều này có vẻ như giải pháp tốt hơn so với câu trả lời được chấp nhận. – CubicleSoft

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