2008-11-23 51 views
8

Gần đây tôi đã đọc một câu hỏi về đây về liên kết tĩnh và động, nhắc tôi về một số câu hỏi mà tôi đã có về nó. Từ bài viết đó, tôi có thể thấy sự khác biệt về kỹ thuật là gì (bao gồm nội dung tệp đối tượng trực tiếp thay vì chỉ trỏ vào nó), nhưng tôi muốn biết thêm một chút về ưu/khuyết điểm của việc làm như vậy. Một trong khi trước đây, một người bạn của tôi đã lập trình vài năm đã than phiền rằng C# không được liên kết tĩnh và nói rằng đó là tính năng mà anh mong muốn nhất cho một phiên bản trong tương lai. Thật không may tôi là một người mới và không thực sự hiểu tuyên bố này.Lợi thế liên kết tĩnh

Cảm ơn mọi giác ngộ!

Trả lời

4

Tôi không chắc chắn nếu liên kết tĩnh là một ý tưởng thực sự tốt trong C# phải trung thực, vì một triệu lý do. Một lý do là, trái ngược với các ngôn ngữ như C hoặc C++, C# có khái niệm về các assembly, về cơ bản là các tệp thực thi hoặc các tệp DLL.

Bây giờ nếu bạn muốn điều liên kết tĩnh trong .NET, bạn có

  • lớp Merge từ nhiều hội vào một hội duy nhất. Điều đó sẽ phá vỡ rất nhiều thứ, như "nội bộ sửa đổi truy cập".
  • Có nhiều hơn một assembly trong cùng một tệp thực thi.Điều đó sẽ làm cho toàn bộ khái niệm về hội đồng vô dụng mặc dù, và sẽ yêu cầu thiết kế lại cách tiếp cận để phản ánh trong Khuôn khổ .NET.

Tôi chắc chắn có một cách thông minh để tránh những vấn đề này, nhưng tôi không thấy điểm liên kết tĩnh trong môi trường được quản lý như .NET hoặc Java. Tôi có nghĩa là, liên kết tĩnh thực sự cải thiện hiệu suất, nhưng không phải là nhiều. Và chúng tôi không sử dụng ngôn ngữ được quản lý cho tốc độ thực thi của họ.

Một vấn đề khác là DLL địa ngục, nhưng trong .NET, đó là khá nhiều vấn đề được giải quyết.

+25

Muốn có một tệp .exe thay vì một .exe và 30 .dll là một lý do hoàn hảo - khách hàng của tôi không cần phải kéo khoảng 30 tệp nữa vì tôi muốn cấu trúc lại phần mềm của mình thành nhiều dự án. Và tôi không thấy lý do tại sao bất cứ điều gì bạn nói * có * là cách nó - họ chỉ có thể lưu trữ các .dll trong .exe, và tải nó lên như một .dll khi nó cần thiết. Không có lý do chính đáng tại sao không thể hỗ trợ liên kết tĩnh. –

+2

Tôi vừa mới biết được rằng F # thực sự hỗ trợ nó. –

+0

Đây là giải pháp thay thế, chỉ cần đảm bảo tên tài nguyên trỏ đến cụm thực sự của bạn: http://blogs.msdn.com/b/microsoft_press/archive/2010/02/03/jeffrey-richter-excerpt-2-from-clr -via-c-third-edition.aspx – Kaganar

7

Một tệp thực thi tĩnh chứa tất cả các đối tượng mà nó cần để không có DLL bên ngoài nào được gọi khi được thực hiện. Các advantaje là đó là di động trên rất nhiều nền tảng không có vấn đề gì phiên bản của DLL đã được cài đặt trên hệ thống đó. Những bất lợi lớn là bạn có thể lãng phí không gian đĩa kể từ khi bạn đang bao gồm trong mã thực thi của bạn mà đã có mặt trong hệ thống/DLL bên ngoài. Hơn nữa tôi nghĩ, nhưng tôi không chắc lắm, các tệp DLL chỉ được nạp trong bộ nhớ chính một lần, cho dù có bao nhiêu tệp thi hành đang sử dụng chúng, nhưng nếu bạn liên kết tĩnh các đối tượng thư viện bên trong tệp thực thi của bạn, bạn tải cùng một mã hai lần (một cho DLL được sử dụng bởi phần còn lại của chương trình và một cho tệp thực thi của bạn). Mặt khác, điều này có thể là một lợi thế thay vì một disatvadvantage, kể từ khi thực thi chỉ chứa các đối tượng của các thư viện bên ngoài mà nó cần, không phải toàn bộ thư viện. Một DLL được nạp trong bộ nhớ như một toàn bộ khi một ứng dụng cần nó.

Liên kết tĩnh là lý tưởng để biên dịch các ứng dụng nhỏ mà bạn muốn mang từ hệ thống này sang hệ thống khác như một công cụ nhỏ. I E. nó thực sự hữu ích cho tôi để có một phiên bản tcpdump được biên dịch tĩnh khi nó không được bao gồm trong mọi bản phân phối Linux. Nó đã được ràng buộc để làm việc trên mọi Linux bất kể phiên bản Kernel, glibc hoặc các thư viện hệ thống khác có. Có lẽ nó đã không có ý nghĩa rất nhiều trong thế giới Windows kể từ khi các nền tảng được nhiều hơn homogeneus. Nếu bạn biên dịch cho Windows XP/NET vX.X nó sẽ hoạt động trên rất nhiều máy tính. Nếu bạn biên dịch một cái gì đó cho Debian X.X, nó chắc chắn sẽ không hoạt động trên các Debian cũ hoặc mới hơn hoặc các bản phân phối khác như Redhat.

Điều này thread cũng có thể giải quyết các câu hỏi của bạn.

7

Lợi thế của liên kết tĩnh là nó loại bỏ sự phụ thuộc bên ngoài vào thư viện Đó cũng là một trong những nhược điểm của liên kết tĩnh; nếu thay đổi hệ điều hành và một phiên bản mới của thư viện là cần thiết để làm việc với nó đúng cách, bạn phải cung cấp một phiên bản nâng cấp của nhị phân của bạn. Tương tự như vậy nếu một bugfix được thêm vào thư viện, bạn không tự động sửa lỗi đó nếu bạn đã liên kết tĩnh.

Hầu hết (trên thực tế, có thể tất cả những ngày này) hệ điều hành có thể tải một bản sao của thư viện động cho nhiều quy trình, đó là lý do tại sao trên UNIX chúng được gọi là đối tượng được chia sẻ.

1

Có một ví dụ điển hình về sự khác biệt giữa liên kết tĩnh và động. Nếu bạn kiểm tra dự án InkScape, bạn sẽ tìm thấy InkscapePortable và InkScape. InkscapePortable sẽ chạy ra khỏi thanh USB. InkScape sẽ không.

2

Tất cả các nội dung bắt buộc được đóng gói thành tệp thi hành. Vì vậy,

  • Bạn không cần phải cài đặt bất kỳ nội dung nào khác. Chỉ cần sao chép và chạy. Hoặc chạy nó ở đâu. Không có trình cài đặt, không báo trước, không có lỗi lạ do phiên bản DLL sai. Đó là tất cả.
  • Ngoài ra, người dùng của bạn có thể tận hưởng sự đơn giản này. Điều này thường quan trọng hơn rất nhiều. Không ai hoan nghênh việc cài đặt các phụ thuộc. Đặc biệt nếu nó rất lớn như .NET framework.

Tất nhiên kích thước tệp thực thi sẽ tăng nhưng nó phải nhỏ hơn nhiều tệp đồ họa ngớ ngẩn.

+0

Những người nghĩ rằng giảm thiểu không gian đĩa tại các chi phí của địa ngục phụ thuộc có ưu tiên của họ ngược –

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