2010-01-20 41 views
6

Để bắt đầu, tôi đã làm việc với C# trong vài tháng, nhưng tôi hoàn toàn không quen với các khái niệm như triển khai và hội đồng, vv Câu hỏi của tôi rất đa dạng, mặc dù tôi rất tức giận và đọc về chúng không có kết quả (hiện tại tôi có Pro C# 2008 và .NET 3.5 Platform trước mặt mình).Làm cách nào để làm việc với các hội đồng và dự án được chia sẻ?

Chúng tôi có quy trình này và bao gồm ba thành phần: động cơ, bộ lọc và logic cho quy trình. Chúng tôi yêu quá trình này rất nhiều, chúng tôi muốn nó tái sử dụng trong các dự án khác. Vì vậy, bây giờ tôi bắt đầu khám phá không gian vượt ra ngoài một giải pháp, một dự án.

Điều này có đúng không? Một giải pháp lớn:

  • Process A, exe
  • Process B, exe
  • Process C, exe
  • Lọc, dll
  • Engine, dll

Động cơ được chia sẻ mã cho tất cả các quy trình, vì vậy tôi giả định rằng có thể là một hội đồng chia sẻ? Nếu một assembly chia sẻ nằm trong cùng một giải pháp như một dự án tiêu thụ nó, nó sẽ bị tiêu thụ như thế nào nếu nó được cho là nằm trong GAC? Tôi đã đọc điều gì đó về sự kiện xây dựng bài đăng. Điều đó có nghĩa là engine.dll phải được tái cấu trúc trên mọi công trình? Ngoài ra, lý do nguyên tắc chúng tôi tách bộ lọc khỏi quy trình (chỉ một quy trình sử dụng nó) là để chúng tôi có thể triển khai bộ lọc độc lập với quy trình sao cho quy trình thực thi không cần phải được cập nhật. Bất kể đó là cách thực hành tốt nhất, chúng ta hãy cuộn với nó. Điều này có thể không? Tôi đã đọc rằng hội đồng liên kết với các phiên bản cụ thể của hội đồng khác, vì vậy nếu tôi cập nhật các DLL chỉ, nó thực sự được coi là giả mạo. Làm thế nào tôi có thể cập nhật các DLL mà không thay đổi EXE? Đó có phải là chính sách dành cho nhà xuất bản không?

Nhân tiện, có bất kỳ nội dung nào của Google có thể hoặc Amazon không? Tôi nên tìm gì? Tôi thấy rất nhiều sách về C# và .NET, nhưng không có gì về triển khai hoặc xây dựng hoặc thử nghiệm hoặc những thứ không liên quan đến chính ngôn ngữ đó.

+0

cuốn sách hay mô tả chính xác những tệp, tập hợp và mô-đun nào là CLR qua C# bởi Jeffrey Richter. IMHO cuốn sách này là không thể thay thế như là một nguồn cho việc học các nguyên tắc cơ bản của .NET –

Trả lời

3

Tôi đồng ý với phân tích của Aequitarum. Chỉ cần một vài điểm bổ sung:

Động cơ được chia sẻ mã cho tất cả các quy trình, vì vậy tôi giả định rằng có thể là một hội đồng được chia sẻ?

Điều đó có vẻ hợp lý.

Nếu một phiên bản dùng chung trong cùng một giải pháp như một dự án tiêu thụ nó, nó được tiêu thụ như thế nào nếu được cho là nằm trong GAC?

Magic.

OK, nó không phải là ma thuật. Giả sử rằng trong giải pháp của bạn, quá trình của dự án có tham chiếu đến công cụ dự án. Khi bạn xây dựng giải pháp, bạn sẽ tạo ra một dự án assembly có tham chiếu đến công cụ assembly. Visual Studio sau đó sao chép các tệp khác nhau vào đúng thư mục. Khi bạn thực hiện quá trình lắp ráp, bộ tải thời gian chạy biết để tìm trong thư mục hiện tại cho lắp ráp động cơ. Nếu nó không thể tìm thấy nó ở đó, nó sẽ tìm trong bộ nhớ cache lắp ráp toàn cục. (Đây là một cái nhìn rất đơn giản về chính sách tải; chính sách thực sự phức tạp hơn nhiều so với chính sách đó.)

Nội dung trong GAC phải đúng là mã toàn cầu; mã mà bạn mong đợi một cách hợp lý các số lượng lớn các dự án khác nhau để sử dụng.

Điều đó có nghĩa là engine.dll phải được triển khai trên mọi công trình?

Tôi không chắc chắn ý của bạn là "được triển khai lại". Như tôi đã nói, nếu bạn có một tài liệu tham khảo dự án, dự án, hệ thống xây dựng sẽ tự động sao chép các tập tin xung quanh đến đúng nơi.

lý do nguyên tắc chúng tôi tách lọc từ quá trình này (chỉ có một quá trình sử dụng nó) là để chúng tôi có thể triển khai các bộ lọc một cách độc lập từ quá trình để quá trình thực thi không cần phải được cập nhật

Tôi đặt câu hỏi liệu điều đó thực sự có giá trị hay không. Kịch bản một: không có lắp ráp bộ lọc, tất cả các mã bộ lọc là trong project.exe. Bạn muốn cập nhật mã bộ lọc; bạn cập nhật project.exe. Kịch bản hai: filter.dll, project.exe. Bạn muốn cập nhật mã bộ lọc; bạn cập nhật filter.dll. Kịch bản hai rẻ hơn hoặc dễ dàng hơn so với kịch bản một như thế nào? Trong cả hai tình huống bạn đang cập nhật một tệp; tại sao tên của tập tin lại quan trọng?

Tuy nhiên, có lẽ nó thực sự rẻ hơn và dễ dàng hơn cho trường hợp cụ thể của bạn. Điều quan trọng cần hiểu về hội đồng là các bộ phận nhỏ nhất là mã độc lập và có thể phân phối lại được. Nếu bạn có hai điều và nó có ý nghĩa đối với phiên bản và gửi chúng độc lập với nhau, thì chúng nên ở trong các hội đồng khác nhau; nếu nó không có ý nghĩa để làm điều đó, thì họ phải ở trong cùng một hội đồng.

Tôi đã đọc các hội đồng liên kết đến các phiên bản cụ thể của các hội đồng khác, vì vậy nếu tôi cập nhật DLL chỉ, nó thực sự được coi là giả mạo. Làm thế nào tôi có thể cập nhật các DLL mà không thay đổi EXE? Đó có phải là chính sách dành cho nhà xuất bản không?

Một hội đồng có thể được cung cấp một "tên mạnh". Khi bạn đặt tên cho Foo.DLL của bạn, và bạn viết Bar.EXE để nói "Bar.EXE phụ thuộc vào Foo.DLL", thì thời gian chạy sẽ tải bất cứ thứ gì xảy ra được đặt tên là Foo.DLL; tên tệp không mạnh. Nếu một hacker ác có phiên bản Foo.DLL riêng của họ trên máy khách, trình nạp sẽ tải nó. Một tên mạnh mẽ cho phép Bar.EXE nói "Bar.exe phiên bản 1.2 được viết bởi Bar Corporation phụ thuộc vào Foo.DLL phiên bản 1.4 được viết bởi Foo Corporation", và tất cả các xác minh được thực hiện đối với các khóa mã hóa mạnh liên kết với Foo Corp và Bar Corp.

Vì vậy, có, một hội đồng có thể được cấu hình để chỉ ràng buộc với một phiên bản cụ thể từ một công ty cụ thể, để ngăn chặn giả mạo. Những gì bạn có thể làm để cập nhật một assembly để sử dụng một phiên bản mới hơn là tạo một file XML nhỏ cho trình loader biết "Tôi biết làm thế nào tôi nói tôi muốn Foo.DLL v1.4? Vâng, thực sự nếu 1.5 có sẵn, OK của nó để sử dụng điều đó nữa. "

Tôi nên tìm gì? Tôi thấy rất nhiều sách về C# và .NET, nhưng không có gì về triển khai hoặc xây dựng hoặc thử nghiệm hoặc những thứ không liên quan đến chính ngôn ngữ đó.

Triển khai thường bị bỏ qua trong sách, tôi đồng ý.

Tôi sẽ bắt đầu bằng cách tìm kiếm "ClickOnce" nếu bạn quan tâm đến việc triển khai các ứng dụng Windows được quản lý.

1

Dự án có thể tham chiếu các hội đồng hoặc dự án.

Khi bạn tham khảo một hội đồng/dự án khác, bạn được phép sử dụng tất cả các lớp công khai/enums/cấu trúc vv trong hội đồng tham chiếu.

Bạn không cần phải có tất cả chúng trong một giải pháp. Bạn có thể có ba giải pháp, một giải pháp cho mỗi Quy trình và cả ba giải pháp đều có thể tải Công cụ và Bộ lọc.

Ngoài ra, bạn có thể có quy trình B và quy trình C tham chiếu các bộ sưu tập được biên dịch (.dll) của Engine và Filter và có hiệu ứng tương tự. Miễn là bạn không đặt thuộc tính trong tham chiếu đến một assembly để yêu cầu một phiên bản cụ thể, bạn có thể tự do cập nhật các tệp DLL mà không cần phải lo lắng nhiều, chỉ cung cấp các thay đổi mã duy nhất là DLL.

Ngoài ra, lý do nguyên tắc chúng tôi tách lọc từ quá trình (chỉ có một quá trình sử dụng nó) là để chúng ta có thể triển khai các bộ lọc một cách độc lập từ quá trình để quá trình thực thi không cần được cập nhật. Bất kể đó là cách thực hành tốt nhất, hãy chúng ta hãy cuộn với nó. Đây có phải là không?

Tôi thực sự thích phương pháp cập nhật này. Ít chi phí hơn để cập nhật các tệp đã thay đổi thay vì mọi thứ.

Đối với việc sử dụng GAC, toàn bộ mức độ phức tạp khác mà tôi sẽ không tham gia.

Giả mạo bằng chứng của bạn có thể được thực hiện bằng cách ký tên, đó là yêu cầu để sử dụng GAC ở nơi đầu tiên, nhưng bạn vẫn nên được miễn là một phiên bản cụ thể là không cần thiết.

Đề xuất của tôi là đọc một cuốn sách về khuôn khổ .NET. Điều này thực sự sẽ giúp bạn hiểu CLR và những gì bạn đang làm.

Applied Microsoft .NET Framework Programming là một cuốn sách tôi thực sự thích đọc.

+0

Lập trình Microsoft .NET Framework đã được thay thế bởi CLR thông qua C# (http://www.amazon.com/CLR-Via-C-Pro-Developer/ dp/0735621632/ref = sr_1_1? ie = UTF8 & s = sách & qid = 1264003319 & sr = 1-1) và ấn bản thứ ba sắp tới (http://www.amazon.com/CLR-via-C-Third-Pro-Developer/dp/0735627045/ref = sr_1_3? Ie = UTF8 & s = sách & qid = 1264003319 & sr = 1-3). – jason

+0

Điều cần biết, cảm ơn Jason, sẽ kiểm tra những điều đó. –

1

Bạn đề cập đến công cụ được chia sẻ mã, đó là lý do tại sao bạn đặt nó trong một dự án riêng biệt theo giải pháp của bạn. Không có gì sai khi làm theo cách này, và không cần thiết phải thêm DLL này vào GAC. Trong giai đoạn phát triển của bạn, bạn chỉ có thể thêm một tham chiếu đến dự án động cơ của bạn, và bạn sẽ có thể gọi mã từ hội đồng đó. Khi bạn muốn triển khai ứng dụng này, bạn có thể triển khai DLL động cơ với nó, hoặc bạn có thể thêm DLL của động cơ vào GAC (đó là một quả bóng sáp khác trong và của chính nó). Tôi có xu hướng dựa vào việc triển khai GAC trừ khi nó thực sự cần thiết. Một trong những tính năng tốt nhất của .NET là khả năng triển khai mọi thứ bạn cần để chạy ứng dụng của bạn trong một thư mục mà không phải sao chép nội dung vào thư mục hệ thống (tức là GAC).

Nếu bạn muốn đạt được thứ gì đó như nạp động DLL và gọi các phương thức thành viên từ bộ xử lý mà không quan tâm đến phiên bản cụ thể, bạn có thể đi một vài tuyến. Tuyến đường dễ nhất là chỉ cần đặt thuộc tính Specific Version thành False khi bạn thêm tham chiếu. Điều này sẽ cung cấp cho bạn sự tự do của việc thay đổi các DLL sau này, và miễn là bạn không mess với chữ ký phương pháp, nó không phải là một vấn đề. Tùy chọn thứ hai là MEF (sử dụng Phản chiếu và sẽ là một phần của khung trong .NET 4.0). Ý tưởng với MEF là bạn có thể quét thư mục kiểu "plugins" cho các tệp DLL thực hiện chức năng cụ thể và sau đó gọi chúng là động. Điều này mang lại cho bạn một số tính linh hoạt bổ sung trong đó bạn có thể thêm các hội đồng mới sau mà không cần sửa đổi các tham chiếu của bạn.

Một điều cần lưu ý là có các mẫu dự án Thiết lập và triển khai được xây dựng trong Visual Studio mà bạn có thể sử dụng để tạo gói MSI để triển khai dự án của mình. MSDN có rất nhiều tài liệu liên quan đến chủ đề này mà bạn có thể kiểm tra, ở đây:

http://msdn.microsoft.com/en-us/library/ybshs20f%28VS.80%29.aspx

1

Làm không sử dụng GAC trên máy xây dựng của bạn, đó là chi tiết triển khai. Visual Studio tự động sao chép các DLL vào thư mục xây dựng của ứng dụng của bạn khi bạn tham khảo các DLL. Điều đó đảm bảo rằng bạn sẽ chạy và gỡ lỗi với phiên bản dự kiến ​​của DLL.

Khi bạn triển khai, bạn đã có lựa chọn. Bạn có thể gửi DLL cùng với ứng dụng sử dụng nó, được lưu trữ trong thư mục cài đặt EXE. Không có gì đặc biệt là cần thiết, CLR luôn có thể tìm thấy DLL và bạn không phải lo lắng về tên hoặc phiên bản mạnh. Bản cập nhật sửa lỗi được triển khai đơn giản bằng cách sao chép tệp DLL mới vào thư mục EXE.

Khi bạn có một số ứng dụng đã cài đặt với sự phụ thuộc vào DLL thì việc triển khai bản cập nhật sửa lỗi có thể bắt đầu trở nên khó xử. Vì bạn phải sao chép vào DLL nhiều lần, một lần cho mỗi ứng dụng. Và bạn có thể gặp rắc rối khi cập nhật một số ứng dụng chứ không phải các ứng dụng khác. Đặc biệt là khi có sự thay đổi đột ngột trong giao diện DLL yêu cầu ứng dụng phải được biên dịch lại. Đó là DLL Hell knocking, GAC có thể giải quyết điều đó.

0

Chúng tôi đã tìm thấy some guidance về vấn đề này tại MSDN. Chúng tôi bắt đầu với hai giải pháp riêng biệt không có mã chia sẻ, và sau đó tóm tắt các điểm chung cho một hội đồng chia sẻ. Chúng tôi đã vật lộn với các cách để cô lập các thay đổi trong mã được chia sẻ để chỉ tác động đến các dự án đã sẵn sàng cho nó. Chúng tôi đã khủng khiếp ở số Open/Close.

Chúng tôi đã thử

  • nhánh mã chia sẻ cho từng dự án mà sử dụng nó và bao gồm nó trong dung dịch
  • sao chép lắp ráp được chia sẻ từ những giải pháp chia sẻ khi chúng tôi thực hiện thay đổi
  • mã hóa trước khi xây dựng các sự kiện để xây dựng giải pháp mã chia sẻ và sao chép assembly

Mọi thứ đều là một nỗi đau thực sự. Chúng tôi đã kết thúc bằng cách sử dụng một giải pháp lớn với tất cả các dự án trong đó. Chúng tôi phân nhánh từng dự án vì chúng tôi muốn các tính năng sân khấu gần hơn với sản xuất. Chi nhánh này cũng chia sẻ mã chia sẻ. Đó là điều đơn giản hóa rất nhiều và chúng tôi có ý tưởng tốt hơn về những thử nghiệm nào không thành công trên tất cả các dự án, vì các thay đổi mã phổ biến.

Theo như triển khai, các tập lệnh xây dựng của chúng tôi được thiết lập để xây dựng mã và chỉ sao chép các tệp đã thay đổi, bao gồm cả các hội đồng, vào môi trường của chúng tôi.

0

Theo mặc định, bạn có số phiên bản được mã hóa cứng trong dự án của mình (1.0.0.0). Miễn là bạn không thay đổi nó, bạn có thể sử dụng tất cả các bộ lọc xây dựng với quá trình lắp ráp (nó chỉ biết nó nên sử dụng 1.Phiên bản 0.0.0). Tuy nhiên, đây không phải là giải pháp tốt nhất, bởi vì làm cách nào để bạn phân biệt giữa các bản dựng khác nhau?

Một tùy chọn khác là sử dụng các phiên bản khác nhau của Bộ lọc theo cùng một Quy trình. Bạn nên thêm tệp app.config vào dự án Quy trình và bao gồm phần tử bindingRedirect (xem tài liệu). Bất cứ khi nào thời gian chạy tìm một phiên bản cụ thể của bộ lọc, nó "chuyển hướng" đến một phiên bản được chỉ ra trong cấu hình. Thật không may, điều này có nghĩa rằng mặc dù bạn không phải cập nhật quá trình Assembly, bạn sẽ phải cập nhật tập tin cấu hình với phiên bản mới.

Bất cứ khi nào bạn gặp sự cố về phiên bản, bạn có thể sử dụng Fuslogvw.exe (trình xem nhật ký kết hợp) để khắc phục sự cố này.

Hãy vui vẻ!

ulu

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