2011-10-18 33 views
5

Tôi cần Dịch vụ của mình để cập nhật các trường trong bộ nhớ dùng chung cho ứng dụng khách để đọc và hiển thị. Tôi đã tìm thấy giải pháp hiện tại của mình không hiệu quả do Session 0 Isolation.Chia sẻ bộ nhớ giữa Dịch vụ và Ứng dụng Windows, điều gì là dễ nhất?

Tôi đã đổi tên thành mutex es trong không gian tên toàn cầu mà sửa chữa yếu tố đó, nhưng nó không giống như các dll sẽ tuân theo chia sẻ giữa các phiên bất chấp một giải pháp cho Session 0 Isolation phúc:

"Chọn rõ ràng không gian tên Local \ hoặc Global \ cho bất kỳ đối tượng được đặt tên nào, chẳng hạn như sự kiện hoặc bộ nhớ được ánh xạ mà dịch vụ có sẵn."

Tôi không biết phần nào của dll có thể được phân loại là đối tượng được đặt tên và sẽ mất quá nhiều thời gian để cài đặt lại và bước qua nó để kiểm tra.

Tôi đã thấy số lượng mã cho các kênh được đặt tên và đã được tắt. Tôi không muốn tạo một tập tin mà chạm vào đĩa như tôi tưởng tượng là cần thiết của giải pháp memoryMappedFile. Có thể chia sẻ các phần của dll được thực hiện để làm việc? Nếu không thì điều gì là dễ nhất?

public ref class ServerGUIBridge 
{ 
public: 
#pragma data_seg(".sdata") 
    static int commonIntShouldBeGlobal = 0; 
    static bool hasBeenInitializedMakeMeGlobal = false; 
#pragma data_seg() 
#pragma comment(linker, "/section:.sdata,rws") 

Tôi đang sử dụng .NET 2.0 để không có WCF.

+0

Nếu bạn tạo tệp ánh xạ bộ nhớ với INVALID_FILE_HANDLE, thì không có tệp nào được tạo. Nó chỉ là bộ nhớ được phân trang khi không được truy cập trong một thời gian. Lưu ý rằng các phần được chia sẻ là một lỗ hổng bảo mật - bạn không thể đặt ACL trên một phần được chia sẻ. (Điều gì xảy ra nếu một máy khách đi vào và thực hiện 'hasBeenInitializedMakeMeGlobal = false' hoặc' commonIntShouldBeGlobal = rand() '?) –

+0

@Raymond" Nếu hFile là INVALID_HANDLE_VALUE, quá trình gọi cũng phải chỉ định kích thước cho đối tượng ánh xạ tệp trong dwMaximumSizeHigh và các thông số dwMaximumSizeLow. Trong trường hợp này, CreateFileMapping tạo một đối tượng ánh xạ tệp có kích thước được chỉ định được hỗ trợ bởi tệp hoán trang hệ thống thay vì bởi một tệp trong hệ thống tệp. " - Vậy nó được sao lưu nếu tệp phân trang hệ thống bị tắt? – John

+1

"Được hỗ trợ bởi tệp trang hệ thống" là từ ngữ kém. Nó thực sự nên được "hỗ trợ bởi hệ thống bộ nhớ ảo." Nếu pagefile bị vô hiệu hóa, thì hệ thống bộ nhớ ảo chỉ là bộ nhớ vật lý. –

Trả lời

0

Một phương pháp thường bị bỏ qua của IPC là ghi vào sổ đăng ký. Đối với hai thành viên POD, tôi đề xuất chia sẻ điều này sẽ là giải pháp lý tưởng. IPC, MSDN, and the registry

0

Tất cả phiên bản Khuôn khổ .NET có tính năng Remoting. Nó cho phép gọi các phương thức trong một appdomain khác có thể nằm trong các tiến trình riêng biệt. Xem MSDN để biết mẫu và cách sử dụng: http://msdn.microsoft.com/en-us/library/kwdt6w2k(v=VS.80).aspx

+0

Tôi thực sự cần biết về Từ chối. Một ngày. Đó là khá nhiều bằng cách trên cao như nó liên quan đến liên lạc giữa các máy tính. – John

+0

Remoting có sẵn nhưng được coi là lỗi thời cho các phiên bản .NET mới hơn, được thay thế bằng WCF linh hoạt hơn (và phức tạp hơn). –

1

Tôi muốn đề xuất các ống có tên: sau đó bạn có sự cách ly được kiểm soát thích hợp giữa hai quy trình. Chia sẻ các tệp DLL nghe có vẻ như nguy hiểm.

ống đặt tên là tài liệu trên MSDN ở đây: http://msdn.microsoft.com/en-us/library/aa365590.aspx

và tìm .NET 2.0 bài viết hữu ích là ở đây: http://www.switchonthecode.com/tutorials/interprocess-communication-using-named-pipes-in-csharp

(Gấu nhớ rằng .NET 3.5 trở lên có một lớp NetNamedPipeBinding [http://msdn.microsoft.com/en-us/library/system.servicemodel.netnamedpipebinding.aspx] đó là một phần của WCF)

+0

Tôi đã từng cố gắng chia sẻ các đường ống có tên giữa một quy trình nâng cao và một quy trình bình thường và không thể thực hiện được. Có một số tham số đặc biệt cần được thiết lập không? – RedX

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