Chúng tôi có một dự án Khung thực thể với một số mô hình được thiết lập bằng .NET 4 và VS2010. Sau đó, chúng tôi có một số dự án cần sử dụng dự án thực thể này. Chúng tôi đã biên soạn thành công dự án EF thành một DLL. Chúng tôi cũng đã thêm thành công tham chiếu EF dll vào nhiều dự án đang hoạt động tốt.Chia sẻ Thư viện Khuôn khổ Thực thể qua nhiều dự án
Vấn đề bây giờ là chúng tôi có một số chương trình (ASP.NET và giao diện điều khiển ứng dụng) tham chiếu EF dll này và dll được sao chép cục bộ cho mỗi chương trình gọi, khi chúng tôi thực hiện thay đổi cho EF dll, chúng tôi có để đi vào từng dự án và thay thế EF dll bằng bản dựng mới.
Tôi đã thực hiện rất nhiều tìm kiếm thư viện chia sẻ và thậm chí cả các dự án EF trên nhiều dự án. Trong khi tôi đã tìm thấy một số, tôi dường như không thể tìm thấy một ví dụ tốt mà tôi có thể làm cho tình hình của tôi hoặc đó không phải là quá cũ mà nó không liên quan.
Đó là vấn đề chung mà tôi đang gặp phải. Để đưa ra ý tưởng tốt hơn về các vấn đề tôi đang gặp phải, tôi sẽ tập trung vào một dự án cụ thể. Đây là một dự án biểu mẫu web ASP.NET cho trong mạng nội bộ. Nếu chúng tôi thêm tài liệu tham khảo EF dll và cho phép dự án sao chép dll tại địa phương, EF hoạt động rất tốt. Tuy nhiên, bởi vì chúng tôi có nhiều dự án, bây giờ chúng tôi cần phải cố gắng và tập trung vào EF dll một nơi nào đó mà nó có thể được chia sẻ bởi nhiều quy trình. Tôi không cố gắng để thiết lập này để một dll EF được truy cập trên nhiều máy chủ. Tôi rất vui khi cài đặt một bản sao của DLL trên các máy chủ cá nhân nếu cần thiết.
Mong muốn của tôi là tạo thư mục "thư viện chung" trên mỗi máy chủ, ví dụ đơn giản "C: \ OurLibraries". Sau đó chúng tôi sẽ đặt hoặc EF dlls (và có thể những người khác sau này) vào thư mục này và cho phép các chương trình/quy trình khác nhau truy cập vào bản sao chung của EF dll. Tôi đã chắc chắn rằng "bản sao cục bộ" của dll EF đã được gỡ bỏ từ dự án mạng nội bộ và thêm một tham chiếu đến tập tin "C: \ OurLibraries \ OurEF.dll". Mọi thứ đều tốt và dự án mạng nội bộ hoạt động tốt cho đến khi nó cố hiển thị một trang có tham chiếu đến EF và sau đó hiển thị thông báo lỗi:
"Không thể tải loại 'EntityNS.ProductDBEntity'."
Nếu tôi bật "bản sao cục bộ" trong tham chiếu, trang web mạng nội bộ hoạt động tốt trở lại. Tôi dường như không thể tìm thấy thiết lập ma thuật đó sẽ cho phép tôi chia sẻ tập tin EF.
Tôi đã thử những điều sau đây dựa trên bài viết khác nhau, nhưng không thành công:
Ký lắp ráp và thêm vào GAC. Kinh nghiệm cùng một vấn đề như có nó trong "C: \ OurLibraries"
Thêm thư mục "C: \ OurLibraries" vào biến môi trường PATH.
Đã thay đổi chuỗi kết nối của tôi cho EF trong tệp web.config mạng nội bộ của tôi để xóa "OR's" khỏi chuỗi: /Ecomedate.csdl|res:///Ecomedate.ssdl|res:///Ecomedate .msl; nhà cung cấp = Hệ thống ... để ; nhà cung cấp = Hệ thống ...
(dựa trên bài đăng này: Sharing Entity framework objects across projects?)
tôi đã dành nhiều thời gian làm việc về vấn đề này và các diễn đàn tìm kiếm và bài đăng. Tôi biết đã có được một cách để làm điều này nếu không sử dụng lại mã và chia sẻ DLL có vẻ vô ích, vì vậy bất kỳ trợ giúp bạn có thể đề nghị sẽ được đánh giá cao.
Đây là những nỗ lực bổ sung mà tôi đã thực hiện và để phản hồi một số bài đăng từ trước đến nay.
Ngoài ra, đây là những gì tôi đã trải nghiệm với GAC cho đến nay. - trên máy tính có cài đặt VS2010, gacutil nằm trong C: \ Program Files \ Microsoft SDK ... và từ diễn đàn về câu hỏi "gacutil" ở đâu, giai điệu chung là gacutil hiện được coi là công cụ tìm kiếm chứ không phải dự định sử dụng trong môi trường sản xuất. Gacutil không phải là một phần của Server 2008 hoặc Net 4 khuôn khổ, vì vậy có một số gợi ý về cách triển khai và đối phó với GAC DLL
- đầu tiên, theo cách cũ của việc cài đặt, sử dụng gacutil, nhưng bởi sử dụng psexec để sao chép và gọi gacutil trên máy chủ sản xuất. Tôi có thể lấy psexec để chạy gacutil từ một hộp dev cục bộ đến một máy chủ prod và nhận được mã trả về 0, thành công, tuy nhiên tôi không thể tìm thấy cách để thực sự xem nó được cài đặt trên máy chủ sản xuất, bởi vì không có gacutil trên máy chủ prod, tôi không thể sử dụng someting như gacutil/l DataEntity.dll để xem thông tin về dll được cài đặt ... nếu nó thậm chí được cài đặt đúng.
- Tôi đã thử sao chép các tệp gacutil.exe và gacutil.exe.config vào máy chủ sản xuất để thử và chạy từ đó. Trong khi chương trình chạy và cung cấp số phiên bản của gacutil, nó không phản hồi bất kỳ công tắc dòng lệnh nào như gacutil.exe/i DataEntity.dll hoặc gacutil.exe/l DataEntity. Nó chỉ hiển thị thông tin phiên bản gacutil một lần nữa và dừng lại.
- Ai đó đã đề xuất trên diễn đàn để cài đặt Microsoft SDK trên máy sản xuất. Trong khi tôi có thể phải xem xét điều này do thiếu thành công cho đến nay, tôi thực sự không thích ý tưởng cài đặt một SDK trên evironments sản xuất của tôi.
- Tôi đã cố gắng tìm các công cụ như Trình quản lý GAC từ xa để xem và quản lý, nhưng phát triển cuối cùng trên dự án mã nguồn mở đó là năm 2008, vì vậy khi tôi cố gắng sử dụng nó để veiw GAC, nó muốn hiển thị cho tôi c: \ Windows \ assembly gac dlls, nhưng .NET 4 bây giờ sử dụng C: \ windows \ Microsoft.NET \ assembly để lưu trữ các file dll GAC, vì vậy tôi có thể tìm mọi cách để xem hoặc duy trì các file DLL trên gac của server sản xuất từ xa. Nếu tôi chạy một lệnh dir DataEntity.dll/s tại c: \ windows trong dấu nhắc lệnh, tôi tìm thấy dll được nhúng trong thư mục C: \ Windows \ Microsoft.NET \ assembly \ GAC_MSIL, nhưng nếu tôi cố gắng nhìn vào tập tin thông qua thám hiểm trong C: \ Windows \ Microsoft.NET \ assembly \ GAC_MSIL, tôi không thể nhìn thấy dll, vì vậy tôi không thể tìm thấy một công cụ cho phép tôi quản lý (cài đặt, danh sách, gỡ bỏ cài đặt) các DLL trong C: \ Windows \ Microsoft .NET \ assembly \ GAC_MSIL trên máy chủ sản xuất máy chủ 2008.
- Đã có đề xuất cài đặt dll vào gấc bằng cách kéo và thả. Tôi đang cố gắng tự động hóa quá trình triển khai của chúng tôi, vì vậy phải kéo và thả theo cách thủ công không có nhiều ý nghĩa. Sao chép vào thư mục C: \ Windows \ Microsoft.NET \ assembly \ GAC_MSIL có hoạt động không? Tôi đã thử nó, nhưng một lần nữa kể từ khi tôi không thể tìm thấy một công cụ mà sẽ cho tôi thấy DLL cài đặt/đăng ký tôi không thể nói nếu nó làm việc hay không.
- một đề xuất khác là tạo trình cài đặt chỉ cài đặt vào GAC. Tôi đã thử phương pháp này và chạy vào một vài vấn đề. Đầu tiên nó là một quá trình rất thủ công. Tôi không thể tìm ra cách để có được nó để gỡ bỏ cài đặt dll cũ từ GAC và sau đó cài đặt phiên bản mới của DLL trong gac; nó cứ khăng khăng rằng tôi gỡ bỏ cài đặt trước đó trước. Thứ hai, khi tôi đã cố gắng để gỡ bỏ cài đặt dll, nó tiếp tục nói rằng nó đã được sử dụng bởi một ứng dụng khác. Tôi đã thử khởi động lại rồi gỡ cài đặt nó, nhưng không đi. Cuối cùng tôi đã tìm ra nó là IIS và phải tắt IIS, gỡ bỏ cài đặt, khởi động lại, cài đặt, và sau đó khởi động lại IIS. Đây là một nỗi đau trong nhưng để thử và tự động hóa.
Dường như có cách tốt hơn để triển khai dll vào môi trường sản xuất vào thư mục được chia sẻ. Tôi chỉ muốn thử và đặt DataEntity.dll trong thư mục c: \ MyLibraries và có các tiến trình truy cập mà một bản sao của DLL. Microsoft thực hiện nó với C: \ Program Files \ Common Files, vì vậy nó có thể thực hiện được, nhưng bây giờ tôi đã dành nhiều ngày để tìm cách làm việc đáng kể sẽ giảm bớt những nỗ lực bảo trì do GAC hoặc tùy chọn cài đặt, giảm số lượng các dll trùng lặp và tránh xem các dll thay thế nếu được phép 'sao chép cục bộ'.
Tôi chưa bao giờ làm những gì bạn đang cố gắng làm, nhưng tôi sẽ thử tải hồ sơ người dùng Hồ bơi ứng dụng và đảm bảo nó có quyền cho thư mục "C: \ OurLibraries". Hoặc, bạn đã thử nó chưa? –
Tại sao không chỉ để cho mỗi dự án có bản sao cục bộ của riêng mình? nếu dll thay đổi, bạn có thể muốn/cần xây dựng lại chúng, do đó, không rõ bạn đạt được gì từ việc tập trung nó, bên ngoài (IMHO) phiên bản đau khi bạn cần cập nhật ứng dụng và không thể làm như vậy từng phần. –