2016-12-02 12 views
5

Tất cả mã của tôi là dưới sự kiểm soát nguồn, vì vậy tôi chắc chắn 100% mã nguồn không thay đổi. Nhưng nếu tôi xây dựng một C# DLL hai lần nội dung của họ là hơi khác nhau. Tôi có thể tái tạo vấn đề 100% thời gian bằng cách xây dựng, và sau đó xây dựng lại.Sự khác biệt này trong hai tệp DLL được tạo ra từ cùng một mã nguồn là

Điều này dường như không ảnh hưởng đến chương trình, nhưng các công cụ như MSIMSP, được sử dụng để tạo bản vá từ hai tệp MSI bị loại bỏ bởi những thay đổi phút này. Làm các bản vá (cho sản phẩm của tôi) lớn hơn 40x so với chúng.

Tôi đã giải mã cả hai tệp DLL và thông tin lắp ráp, các lớp, v.v. của chúng giống hệt nhau. Các tệp cũng có cùng kích thước, nhưng tất nhiên có thời gian tạo khác. Vì vậy, tôi thực sự không thể hiểu được những gì đã thay đổi.

Vì vậy, tôi đào sâu hơn một chút.

Tôi đã sử dụng WinDiff để tìm các thay đổi và sau đó tham chiếu chéo chúng trong trình chỉnh sửa hex. WinDiff cho thấy một sự thay đổi trong 'dòng' thứ hai và trong một dòng ở khoảng 80% của tập tin.

Trong trình chỉnh sửa hex, tôi thấy byte đầu tiên được thay đổi là byte 0x088 (byte 136). Điều này có vẻ là byte duy nhất thay đổi trên 'dòng' này. Tôi gặp khó khăn trong việc tìm kiếm thay đổi thứ hai vì WinDiff không cho tôi biết bù đắp chính xác byte của thay đổi.

Đây là hình ảnh của các thay đổi, tệp bên phải là nội dung của tệp mới hơn. Hex view

Có ai quen thuộc với make-up (C#) tệp DLL biết byte đã thay đổi có ý nghĩa gì không? Hoặc tốt hơn là làm thế nào để đảm bảo rằng các tập tin DLL vẫn chính xác giống nhau khi bạn xây dựng lại chúng?

+0

Đôi khi có một tệp có tên $ RANDOM_SEED $ trong thư mục bin/release của tôi và nội dung của tệp đó thay đổi mỗi khi tôi xây dựng lại. Tôi đã không đi vào chi tiết, nhưng tôi có thể tưởng tượng rằng đó là một trong hai thay đổi. Ai đó sẽ cần phải làm một số reserch. ** EDIT: ** (nunit của nó, có lẽ không có ảnh hưởng vào dll, do đó, quên bình luận của tôi) http://stackoverflow.com/a/40382757/5962841 – Mafii

+0

Nó có thể có giá trị trong khi của bạn để thử một văn bản tốt/trình soạn thảo hex như Vedit. Tôi đã sử dụng nó từ năm 1989. Nó là một công cụ tốt để có lúc xử lý của bạn ngay cả trong những ngày IDE & intellisense. www.vedit.com –

+3

[Làm cách nào tôi có thể biết hai Dll thuần là như nhau hay không] (http://stackoverflow.com/questions/2735643/how-can-i-tell-whether-two-net-dlls-are- giống nhau) dường như tiếp cận cùng một vấn đề từ một góc độ khác. –

Trả lời

4

Điều này có thể có cái gì để làm với sự khác biệt giữa xây dựng và xây dựng lại

Difference between Build Solution, Rebuild Solution, and Clean Solution in Visual Studio?

nếu nó không nghĩ nó cần phải xây dựng lại một dự án, nó sẽ không. Nó có thể cũng sử dụng bit phần xây dựng của dự án nếu họ không thay đổi

Thực hiện xây dựng sử dụng siêu dữ liệu đằng sau hậu trường và do đó dll của bạn có thể khác nhau

Why is a different dll produced after a clean build, with no code changes?

SOLUTION :

Bạn sẽ cần thực hiện một công trình xác định như được mô tả here

+0

Ye nhưng xây dựng nhiều lần nên sản xuất chính xác cùng một nhị phân mọi lúc, không? – Mafii

+1

@Mafii Thật không may, luôn luôn có điều gì đó xảy ra đằng sau hậu trường ... siêu dữ liệu có vẻ như http://stackoverflow.com/questions/107196/why-is-a-different-dll-produced-after-a-clean- xây dựng-với-không-mã-thay đổi vì vậy Không họ sẽ không sản xuất cùng một tệp nhị phân – Fuzzybear

+0

@Fuzzybear bất kỳ cách nào để bỏ qua các byte siêu dữ liệu để tạo bản vá lỗi? (Có lẽ tôi nên hỏi đó là một câu hỏi riêng biệt) –

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