2010-01-05 41 views
7

Tôi có một dự án thư viện lớp mà tôi đã thực hiện. Hãy gọi nó là ClassA. Trong ClassA tôi cần truy cập một số công cụ nằm trong dll (ToolsDLL.dll).Bạn có thể gộp các dll lại với nhau không?

Trong ClassA tôi đã thêm ToolsDLL.dll vào dự án và chọn tệp ToolsDLL.dll để Sao chép vào thư mục Đầu ra LUÔN. Vì vậy, thư viện xây dựng và biên dịch tốt và trong thư mục đầu ra tôi thấy ClassA.dll cùng với ToolsDLL.dll

Tiếp theo, tôi muốn viết một ứng dụng, nói App_A sử dụng các phương thức trong ClassA. Vì vậy, trong dự án App_A của tôi, tôi đã thêm một tham chiếu đến ClassA.dll để tôi có thể truy cập vào không gian tên của nó. Tất cả là tốt và tốt, nó xây dựng/biên dịch.

Vấn đề là ngay sau khi tôi chạy App_A và nó được đến một điểm mà ToolsDLL.dll cần phải được sử dụng nó ném một ngoại lệ "Không thể tải ToolsDLL.dll. Tôi không hiểu làm thế nào nó có thể là nó không thể tìm thấy dll đó vì nó nằm trong cùng thư mục với ClassA.dll

Tôi thấy rằng nếu tôi đặt ToolsDLL.dll vào thư mục đầu ra của App_A nó hoạt động tốt. Có cách nào xung quanh không? Có bất kỳ cách nào mà ToolsDll.dll có thể bằng cách nào đó đi kèm với ClassA.dll Lý do là khách hàng của tôi sẽ viết các ứng dụng riêng của họ tương tự như AppA và nó sẽ được tốt đẹp nếu họ chỉ phải tham khảo một tập tin trong dự án của họ và không nhiều .

Trả lời

12

Có một công cụ của Microsoft được gọi là ILMerge. Nó có thể sẽ làm những gì bạn muốn, bó một số hội đồng thành một tập tin.

P.S.: Một giải pháp khá thường xuyên khác được sử dụng cho vấn đề của bạn là thêm sự kiện sau xây dựng vào giải pháp/dự án của ứng dụng sao chép yêu cầu ToolsDLL.dll vào thư mục đầu ra? Một cái gì đó dọc theo dòng:

xcopy /y /d $(SolutionDir)\lib\ToolsDLL.dll $(OutputDir)\ToolsDLL.dll 

(. Xin lỗi nếu tôi nhận được một số của nó sai, tôi đang gõ những dòng này từ bộ nhớ của tôi)

Tất nhiên, khách hàng của bạn cũng sẽ phải làm điều này. Nhưng sau đó một lần nữa họ đã có thể làm điều này trước đây.

+0

Có vẻ như ILMerge chỉ có thể được sử dụng trên một hội đồng .Net. Đúng không. Trong trường hợp của tôi, ToolsDLL.dll đã được cung cấp cho tôi bởi một sản xuất chip. Tôi không biết nếu nó là một hội đồng .net hay không. Điều đó có quan trọng không? – PICyourBrain

+0

Có, tôi tin rằng nó chỉ hoạt động cho các hội đồng .NET. Để tìm ra loại '.dll' bạn đã có, có lẽ bạn có thể sử dụng.Tiện ích NET SDK 'ildasm', để thử và tháo rời' .dll'. Nếu đó là một hội đồng .NET, điều này sẽ hoạt động; nếu nó chứa mã gốc, 'ildasm' sẽ thất bại. – stakx

+0

Tôi nhận thấy trong Visual Studio nếu tôi đi đến ToolsDll.dll -> Thuộc tính có một tài sản được gọi là hành động. Tôi có thể chỉ cài đặt tài nguyên này thành Tài nguyên được nhúng không? – PICyourBrain

1

Bạn đã thêm DLL vào dự án chưa, hoặc bạn có thực sự thêm tham chiếu vào nó không? Bạn nên làm điều thứ hai, sau đó loại điều này được đưa về chăm sóc tự động cho bạn. Có vẻ như bạn đã thêm tệp thực sự vào tệp dự án và đặt tệp đó thành bản sao.

Nếu bạn chắc chắn muốn có một cách tiếp cận tập tin duy nhất, sau đó chấp nhận lời đề nghị của người khác của ILMerge rõ ràng ...

0

Bạn có thể sử dụng một công cụ sáp nhập IL, hoặc cài đặt ToolsDLL.dll trong GAC.

Ngoài ra nếu bạn nhìn vào đầu ra của App_A, ClassA.dll đã có, đó là nơi mà nó tìm kiếm ToolsDLL.dll.

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