Làm cách nào một ứng dụng Metro trong Windows 8 có thể giao tiếp với một ứng dụng máy tính để bàn phụ trợ trên cùng một máy?


120

Trong trường hợp bạn có giao diện người dùng được xây dựng bằng cách sử dụng kiểu ứng dụng Metro mới cho windows 8 và muốn nó giao tiếp với ứng dụng .NET đang chạy trên máy tính để bàn trên cùng một máy cục bộ (ví dụ: ứng dụng dịch vụ windows).

Những hình thức giao tiếp liên quy trình nào có sẵn giữa ứng dụng metro và ứng dụng máy tính để bàn?

Cảm ơn Pavel Minaev của nhóm Visual Studio, người đã cung cấp một số thông tin ban đầu ở đây trong một nhận xét, được trích dẫn:

Theo Martyn Lovell, không có bất kỳ cơ chế cố ý nào cho điều đó và một số có thể được sử dụng cho nó bị hạn chế một cách có chủ ý. Ví dụ: các đường ống được đặt tên không có ở đó, cũng như các tệp được ánh xạ bộ nhớ. Có các ổ cắm (bao gồm cả ổ cắm máy chủ), nhưng khi kết nối với localhost, bạn chỉ có thể kết nối với cùng một ứng dụng. Bạn có thể sử dụng các tệp bình thường trong một trong các "thư mục đã biết" được chia sẻ (Tài liệu, Hình ảnh, v.v.), nhưng đó là một cách hack khá thô bạo cần phải thăm dò ý kiến ​​và người dùng có thể nhìn thấy. - Pavel Minaev bình luận về vấn đề này

Vì vậy, thất bại trong các cách tiếp cận thông thường, tôi đã nghĩ đến việc sử dụng các dịch vụ web hoặc đọc / ghi vào cơ sở dữ liệu để có được một số hình thức giao tiếp xảy ra, cả hai đều có vẻ như quá mức cần thiết khi các quy trình đang chạy trên cùng một máy.

Những gì tôi đang cố gắng ở đây có ý nghĩa không? Tôi có thể thấy nhu cầu ứng dụng metro làm giao diện người dùng giao diện người dùng cho một dịch vụ hiện có đang chạy trên máy tính để bàn. Hoặc tốt hơn là chỉ sử dụng WPF cho giao diện người dùng giao diện người dùng chạy trên máy tính để bàn (tức là một ứng dụng không phải metro).


2
Điều gì về một dịch vụ WCF địa phương?
Gleno

2
@Gleno sẽ được đề cập đến "suy nghĩ sử dụng các dịch vụ web" trong câu hỏi. Điều đó nói rằng, tôi tự hỏi liệu nó có hoạt động không - nếu việc triển khai thư viện máy khách WCF được cung cấp trong .NET Core được xây dựng trên các ổ cắm WinRT, thì có lẽ sẽ áp dụng cùng một hạn chế "không có máy chủ cục bộ". Điều này cần được kiểm tra.
Pavel Minaev

1
Có vẻ như NetNamedPipeBinding và NetTcpBinding của WCF (qua localhost) sẽ không khả dụng do những hạn chế trong metro. Điều đó sẽ để lại các dịch vụ web hoặc các ràng buộc MSMQ? Thành thật mà nói, không chắc WCF có sẵn trong metro hay không.
dodgy_coder

6
Hãy để tôi xoay chuyển câu hỏi của bạn và hỏi bạn: Điều gì sẽ xảy ra nếu dịch vụ máy tính để bàn mà bạn đang giao tiếp không có mặt? Hãy nhớ rằng ứng dụng của bạn chỉ có thể được cài đặt từ cửa hàng và do đó nó không thể dựa vào sự hiện diện của dịch vụ máy tính để bàn.
Phục hồiMonica Larry Osterman,

3
Có vẻ như các doanh nghiệp có thể tải các ứng dụng tùy chỉnh và bỏ qua Windows Store. Nếu vậy, bạn có thể giả sử một số ứng dụng đang chạy trong môi trường doanh nghiệp. Điều đó nói rằng, tôi nghĩ người đăng ban đầu nên sử dụng giao diện người dùng WPF trên máy tính để bàn cho các mục đích của mình.
Ankur Goel

Câu trả lời:


54

Tôi đang chuyển dự án hiện có của mình sang Win8 ngay bây giờ. Nó bao gồm dịch vụ cửa sổ và ứng dụng khay đang nói chuyện với nhau thông qua NamedPipes WCF. Như bạn có thể đã biết Metro không hỗ trợ các đường ống được đặt tên. Tôi đã kết thúc sử dụng TcpBinding cho kết nối song công.

Bài đăng này mô tả chức năng nào được hỗ trợ.

Mẫu máy chủ WCF của tôi mà máy khách Metro có thể sử dụng ở đây .

Cũng nên nhớ rằng bạn không thể sử dụng WCF đồng bộ trong Metro. Bạn sẽ phải sử dụng trình bao bọc dựa trên Tác vụ chỉ không đồng bộ.

Và cảm ơn bạn cho câu hỏi của bạn. Tôi là điểm khởi đầu tốt cho tôi :)


7
Cảm ơn vì điều này ... đó là một sự trợ giúp tuyệt vời. Thật tốt khi thấy một câu trả lời thiết thực thay vì chỉ được nói rằng không nên / không thể làm được.
dodgy_coder

1
Nó có thể là một câu hỏi ngu ngốc ... nhưng bạn có thể kết nối với localhost bằng cách sử dụng mẫu của bạn hay không? Câu hỏi bạn liên kết đến hiển thị nội bộ của Visual Studio (Tôi đã suy luận nó từ đường dẫn, nhưng nếu tôi sai, vui lòng sửa cho tôi). WCF (kết hợp với localhost) có hoạt động bên ngoài WCF không?
dzendras

1
@dzendras Chắc chắn, nó sẽ hoạt động. Nó cũng sẽ hoạt động với localhost.
chuyên gia

3
Tuy nhiên, tôi nghi ngờ một ứng dụng như thế này sẽ vượt qua chứng nhận Cửa hàng.
Ani

6
Nếu có bất kỳ điều gì thì đây là quy tắc mà tôi nghĩ rằng có thể được trích dẫn "3.9 Tất cả logic ứng dụng phải bắt nguồn từ và nằm trong gói ứng dụng của bạn Ứng dụng của bạn không được cố gắng thay đổi hoặc mở rộng nội dung được đóng gói thông qua bất kỳ hình thức bao gồm động nào của mã hoặc dữ liệu thay đổi cách ứng dụng tương tác với Windows Runtime hoặc hoạt động liên quan đến chính sách Store. Chẳng hạn, không được phép tải xuống tập lệnh từ xa và sau đó thực thi tập lệnh đó trong ngữ cảnh cục bộ của gói ứng dụng của bạn. "
Ani

38

Có một số câu hỏi như thế này ở cuối // build / session mà tôi đã tham dự. Aleš Holeček, người thực hiện một trong những buổi chụp ảnh lớn, đã ra khỏi khán giả để xử lý chúng. Ngay cả khi bạn không phải là nhà phát triển C ++, hãy tải xuống phiên đó và xem H & A. http://channel9.msdn.com/Events/BUILD/BUILD2011/TOOL-789C

Ứng dụng Metro không thể tính vào các ứng dụng hoặc dịch vụ dành cho máy tính để bàn đang được cài đặt trên máy. Và các ứng dụng dành cho máy tính để bàn không thể tính đến các ứng dụng Metro đang chạy vì chúng có thể bị tạm ngưng bất cứ lúc nào. Bạn cần bắt đầu suy nghĩ khác đi. Nghe Aleš về cái này.


6
Câu hỏi chính xác này dường như được hỏi vào lúc 47:20 trong video.
Pavel Minaev

3
... và một nữa lúc 55:00. Câu trả lời, nói chung, có vẻ là "không, bạn không thể làm điều đó".
Pavel Minaev

1
@dodgy_coder Tôi không chắc WCF / TCP (hoặc HTTP) sẽ hoạt động trên cùng một máy. Nếu hộp cát không cho phép bạn kết nối localhosttrực tiếp qua ổ cắm TCP, tại sao nó lại cho phép bạn làm điều tương tự qua WCF?
Pavel Minaev

2
Điều thú vị là có hỗ trợ giao tiếp giữa hai ứng dụng tàu điện ngầm thông qua hợp đồng chia sẻ nhưng điều này dường như tương tự cách sử dụng với khay nhớ tạm và để chuyển một chiều từ ứng dụng nguồn sang ứng dụng đích, thay vì triển khai nói một hai -giao thức giao tiếp.
dodgy_coder

4
Có vẻ như với tôi rằng các ứng dụng LOB Metro được tải bên cạnh sẽ không có vấn đề gì tùy thuộc vào ứng dụng hoặc dịch vụ dành cho máy tính để bàn được cài đặt. Tôi rất khó tin rằng kịch bản rất thực tế này sẽ không được hỗ trợ. Với Silverlight, chúng tôi đã thấy khả năng tương tác máy tính để bàn / gốc tăng dần ... Tôi khá chắc chắn rằng một số thứ trong các trường hợp này (đường ống có tên, tệp được ánh xạ bộ nhớ hoặc thứ gì đó ...) sẽ được hỗ trợ (với tài liệu hướng dẫn) trong tương lai.
David Cuccia,

11

Lưu ý rằng với Bản cập nhật Windows 8.1, giao tiếp giữa các ứng dụng Windows Store và các thành phần máy tính để bàn được viết bằng C # cho .NET 4.5+ hiện được hỗ trợ chính thức cho các ứng dụng tải bên trong các kịch bản Doanh nghiệp:

Cấu phần thời gian chạy của Windows bị hỏng cho các ứng dụng Windows Store được tải bên

Để trích:

Nhận thức được rằng các chức năng và quy tắc kinh doanh quan trọng được thể hiện trong nội dung phần mềm hiện có và các doanh nghiệp có nhiều tình huống mà kiểu ứng dụng mới sẽ có hiệu suất cao, Bản cập nhật Windows 8.1 bao gồm một tính năng mới được gọi là Cấu phần thời gian chạy của Windows được chia sẻ cho tải bên các ứng dụng. Chúng tôi sử dụng thuật ngữ IPC (giao tiếp giữa các quá trình) để mô tả khả năng chạy nội dung phần mềm máy tính để bàn hiện có trong một quá trình (thành phần máy tính để bàn) trong khi tương tác với mã này trong ứng dụng Windows Store. Đây là một mô hình quen thuộc với các nhà phát triển doanh nghiệp vì các ứng dụng cơ sở dữ liệu và ứng dụng sử dụng Dịch vụ NT trong Windows có chung một kiến ​​trúc đa quy trình tương tự.

Mặc dù việc triển khai cách tiếp cận này ban đầu hơi phức tạp, nhưng nó cho phép tích hợp sâu trên Windows Store và các thành phần máy tính để bàn. Chỉ cần lưu ý rằng hiện tại, nó sẽ không vượt qua chứng nhận Windows Store công khai.


5

Có một bài viết trên InfoQ về cách xây dựng các ứng dụng Metro được kết hợp lỏng lẻo với trình xử lý giao thức. Đây là thứ đã được Windows hỗ trợ từ lâu và người ta có thể thấy trước một ứng dụng máy tính để bàn tự đăng ký như một trình xử lý giao thức và có thể ứng dụng metro có thể giao tiếp thông qua cơ chế này.

Tôi không biết liệu điều này có khả thi không, nhưng có thể rất thú vị khi kiểm tra.


Bài báo viết: "Cách bạn có thể thực hiện việc này trong Metro [chuyển sang quy trình làm việc khác trong một ứng dụng khác - vì ứng dụng của bạn có nghĩa là nhỏ và tập trung cao] là tận dụng các giao thức. Ví dụ của chúng tôi ở trên, giao thức có thể trông giống như “Acme-stock-buy: // client = 123 & stock = XYZ”. " - Về mặt kỹ thuật, "giao thức đòn bẩy" có nghĩa là gì?
Lumi

Vấn đề với cách tiếp cận này là nó chỉ giao tiếp một chiều.
chuyên gia

3

Christophe Nasarre đã viết blog về một cách khá khó thực hiện bằng cách sử dụng các tệp cục bộ. Kết quả là giao tiếp giữa ứng dụng máy tính để bàn / ứng dụng cửa hàng windows (được gọi là DA / WSA trong blog) mà không cần phải chuyển đổi giữa giao diện người dùng của hai ứng dụng. Anh ấy cũng viết blog về một kỹ thuật khác ít hack hơn liên quan đến các trình xử lý giao thức.

Lưu ý rằng việc có WSA giao tiếp với DA bị cấm rõ ràng theo yêu cầu chứng nhận Ứng dụng store

Các ứng dụng Windows Store không được giao tiếp với các ứng dụng hoặc dịch vụ trên máy tính cục bộ thông qua cơ chế cục bộ, bao gồm cả qua tệp và khóa đăng ký.

... nhưng nó chỉ hạn chế "cơ chế cục bộ". Vì vậy, tôi đoán người ta có thể xây dựng một dịch vụ web để định tuyến thông tin liên lạc.


3

Nếu bạn nghĩ rằng bạn có thể thực hiện thêm một thao tác cmd thủ công, bạn có thể thử:

X:/> CheckNetIsolation.exe LoopbackExempt a n=<packageID>;

CheckNetIsolation.exe được bao gồm trong cài đặt winRT, vì vậy không có gì bổ sung để cài đặt.

Tôi đã thử: nó hoạt động, ngay cả sau khi cập nhật gói.

Như được hiển thị trên: http://msdn.microsoft.com/en-us/library/windows/apps/Hh780593.aspx

Đây là phần giải thích cách tìm ra packageID cho ứng dụng của bạn: http://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/82bad7d4-d52b-4731-a396-13ab9004c1cc/how-to-get- the-appid-of-a-metro-style-app-


Tôi muốn có thể giao tiếp với localhost cho một ứng dụng nội bộ và tôi chỉ có thể làm cho điều đó xảy ra trên các máy tính không chạy VS bằng lệnh này.
adosaiguas

2

Có thể giao tiếp trên cùng một máy từ ứng dụng Metro đến ứng dụng dành cho máy tính để bàn bằng dịch vụ cục bộ. Cách đây ít lâu, tôi đã triển khai "bằng chứng khái niệm" đơn giản, cách vượt qua hộp cát WinRT bằng dịch vụ cục bộ. Nó vẫn cần một số loại "kỹ thuật xã hội" hoặc hướng dẫn trực tiếp để cài đặt dịch vụ, nhưng dù sao, nó vẫn có thể.
Mặc dù vậy, tôi không chắc về các quy tắc chứng nhận về giao tiếp "dịch vụ cục bộ" khi thêm ứng dụng đó vào Windows Store.

Mẫu ở đây

Theo thiết kế, ứng dụng Metro không thể truy cập trực tiếp vào PC bên dưới, chỉ sử dụng WinRT API và các khả năng có sẵn. Nhưng khi bạn tạo dịch vụ back-end để truy cập PC và tất cả dữ liệu ở đó, về cơ bản nó không còn chạy trong hộp cát nữa.

"Vấn đề" duy nhất là người dùng phải cài đặt thủ công dịch vụ back-end này, nhưng đó sẽ không thành vấn đề khi sử dụng một số "kỹ thuật xã hội": Người dùng tải xuống ứng dụng Metro "trình duyệt PC", người dùng có thể duyệt tất cả ảnh, nhạc và video , sử dụng WinRT API, nhưng ứng dụng cũng hiển thị thông báo ở dưới cùng: "Tải xuống powerpack trình duyệt PC của chúng tôi và duyệt toàn bộ PC của bạn, MIỄN PHÍ"

Người dùng được chuyển hướng đến trang web, từ đó người dùng có thể tải xuống trình cài đặt dành cho máy tính để bàn cổ điển chứa dịch vụ back-end "PC browser" để truy cập tệp trên toàn bộ PC của người dùng. Sau khi cài đặt dịch vụ máy tính để bàn này, ứng dụng Metro có thể phát hiện và sử dụng nó để duyệt toàn bộ PC. Người dùng hài lòng, nhưng hộp cát WinRT đã bị xâm phạm.

Tất nhiên điều này sẽ không hoạt động trên máy tính bảng Windows 8 ARM. Sử dụng giải pháp này thậm chí có thể xây dựng các ứng dụng khách Metro cho các ứng dụng máy tính để bàn cổ điển như antivirus, torrent / P2P client, v.v.


3
Không chắc tại sao bạn cần đề cập đến kỹ thuật xã hội ... vì câu hỏi ban đầu là nói về ứng dụng / dịch vụ trên máy tính để bàn nói chuyện với ứng dụng tàu điện ngầm, người dùng sẽ cần cài đặt riêng ứng dụng / dịch vụ dành cho máy tính để bàn. Vậy bạn đã sử dụng phương thức giao tiếp nào giữa dịch vụ máy tính để bàn và ứng dụng tàu điện ngầm?
dodgy_coder

0

Có thể tôi đã bỏ sót điểm nhưng khi kích hoạt khả năng Mạng riêng, tôi có thể kết nối với máy chủ đang chạy cục bộ (http) bằng địa chỉ IP cục bộ (không phải localhost). Điều này cho phép tình huống của tôi trong đó ứng dụng winrt giao tiếp với ứng dụng wpf trên máy tính để bàn

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.