2013-01-24 34 views
10

Tôi đang cố gắng một cái gì đó thăm dò:Có thể chỉ hợp nhất một tập con của các phụ thuộc sử dụng ILMerge không?

Nói rằng tôi có một thư viện "coolproject" và nó có phụ thuộc vào one.dll, two.dllthree.dll.

Tôi muốn sử dụng ILMerge để kết hợp coolproject với one.dlltwo.dll nhưng NOT three.dll. Khi hoàn thành hợp nhất, tôi cần có coolproject.dllthree.dll. Bất cứ nơi nào tôi định sử dụng coolproject.dll Tôi cũng phải tham chiếu three.dll

Điều này thậm chí còn có thể? Bất cứ khi nào tôi thử nó tôi nhận được. Unresolved assembly reference not allowed: three. Tôi đang bỏ qua three.dll bằng cách đặt "Sao chép địa phương" = sai.

[EDIT]:

thực hiện như sau:

ILMerge /targetplatform:v2 /log /internalize /out:bin\coolproject.dll obj\Debug\coolproject.dll C:\Users\Nick\Projects\test\bin\one.dll C:\Users\Nick\Projects\test\bin\two.dll 
+0

How are you gọi ILMerge? Thông báo lỗi là đúng IIRC, bạn cần 'ba.dll' ở đó (hoặc một nơi nào khác mà ILMerge có thể nhìn thấy nó), nhưng điều đó sẽ không tự động có nghĩa là nó được hợp nhất. – hvd

+0

Có phải cho dự án WPF không? –

+0

@Bob đây là thư viện C# chuẩn. – NickSuperb

Trả lời

7

Lý do điều này không hoạt động đã trở nên khá đơn giản: ILMerge phải có khả năng định vị tệp dll mà bạn đã bỏ qua khỏi danh sách.

Khi đánh giá phụ thuộc trong thư viện đích, ILMerge theo mặc định sẽ kiểm tra các vị trí khác nhau để xác định thư viện phụ thuộc (\ bin, GAC, v.v.) ngay cả khi bạn bỏ qua nó khỏi danh sách dòng lệnh. Nếu không thể định vị thư viện này, bạn phải chỉ định vị trí của nó bằng cách sử dụng công tắc \lib. Nếu không, bạn sẽ thấy lỗi Unresolved assembly reference not allowed: three.

Ví dụ:

ILMerge /lib:..\three\bin\three.dll /targetplatform:v2 /log /internalize /out:bin\coolproject.dll obj\Debug\coolproject.dll C:\Users\Nick\Projects\test\bin\one.dll C:\Users\Nick\Projects\test\bin\two.dll 
+0

Điều này có để lại ba.dll như là một tham chiếu bên ngoài trong DLL được sáp nhập hay không, nó cũng làm nội bộ hóa nó? Cám ơn. – Mightymuke

+0

Kết quả này trong ba.dll là một tham chiếu bên ngoài mà là ý định trong trường hợp này. Điều này cũng có thể là một giải pháp mương cuối cùng cho các lỗi va chạm và không gian tên cho các assembly được nội bộ hoá. – NickSuperb

+1

Nếu tôi cố gắng chỉ định một DLL trong đối số/lib:, ILMerge không thành công với "Thư mục tìm kiếm được chỉ định 'C: \ a \ b \ c.dll' không tìm thấy." –

-2

Tôi nghĩ rằng bạn đang tìm kiếm 'loại trừ' tham số cho /internalize switch. Ví dụ, nếu bạn sử dụng

/internalize:excludes.txt 

nơi tệp excludes.txt chứa

three.dll 

nó sẽ nội hóa one.dlltwo.dll nhưng để lại three.dll như một dependancy bên ngoài.

Dưới đây là một vài bài đăng trên blog rằng đi vào chi tiết hơn nữa:

Cập nhật: Từ documentation:

2,10 ExcludeFile

chuỗi công khai ExcludeFile {get; bộ; }

Thuộc tính này chỉ được sử dụng kết hợp với thuộc tính Nội bộ hóa (Mục 2.12). Khi điều này được thiết lập trước khi gọi Merge, nó cho biết đường dẫn và tên tệp sẽ được sử dụng để xác định các loại không được sửa đổi mức hiển thị của chúng. Nếu Internalize là true, nhưng ExcludeFile là "", thì tất cả các kiểu trong bất kỳ assembly nào khác ngoài assembly chính được tạo ra không công khai. Đặt thuộc tính này ngầm đặt thành Internalize thành true.

Nội dung của tệp phải là một biểu thức chính quy trên mỗi dòng. Cú pháp được định nghĩa trong không gian tên .NET System.Text.RegularExpressions cho các biểu thức chính quy. Cụm từ thông dụng được đối sánh với tên đầy đủ của từng loại, ví dụ: "System.Collections.IList". Nếu khớp không thành công, nó sẽ được thử lại với tên lắp ráp (bao quanh bởi dấu ngoặc vuông) được thêm vào tên kiểu. Do đó, mẫu “[A]. *” Loại trừ tất cả các loại trong assembly A không được công khai. (Các dấu gạch chéo ngược là bắt buộc vì chuỗi được coi là cụm từ thông dụng.) Mẫu “N.T ”sẽ phù hợp với tất cả các loại có tên T trong không gian tên có tên N bất kể chúng được định nghĩa là gì.

Điều quan trọng cần lưu ý là các biểu thức thông thường không được neo vào đầu chuỗi; nếu điều này là mong muốn, hãy sử dụng các ký tự toán tử biểu thức chính quy thích hợp để làm như vậy.

2.12 Internalize

public bool Internalize {get; bộ; }

Điều này kiểm soát xem các loại trong hội đồng khác với cụm chính có khả năng hiển thị của chúng được sửa đổi hay không. Khi nó là đúng, sau đó tất cả các loại không được miễn mà có thể nhìn thấy bên ngoài của hội đồng của họ có khả năng hiển thị của họ sửa đổi để họ không nhìn thấy được từ bên ngoài của hội đồng hợp nhất. Một loại được miễn nếu tên đầy đủ của nó khớp với một dòng từ ExcludeFile (Phần 2.10) bằng cách sử dụng công cụ biểu thức chính quy .NET.

+0

Chúc các cử tri xuống đã để lại một bình luận. Đây là những gì tôi làm với dự án của tôi và nó hoạt động tốt, không chắc chắn vấn đề là gì ở đây. – Mightymuke

+0

Không chắc chắn nhưng vấn đề không liên quan đến khả năng hiển thị của các mục được hợp nhất mà là sự bao gồm "vật lý" của mục đó trong hội đồng. Tùy chọn nội bộ hóa và loại trừ không liên quan. – NickSuperb

0

Tôi đã viết một công cụ nhỏ để giải quyết vấn đề này.

Mã nguồn có thể được tìm thấy @https://github.com/leppie/ReferenceRemover.

Trong bạn là trường hợp nó sẽ được sử dụng như:

ReferenceRemover three.dll "(one|two).*" coolproject.dll 

Giải thích về args:

  1. hội để kiểm tra
  2. Regex để phù hợp với tài liệu tham khảo
  3. Việc lắp ráp nó cần phải chuyển hướng đến

Đầu ra là three.dll với các tham chiếu được điều chỉnh.

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