2015-08-17 18 views
10

Câu hỏi: Cách tạo đối tượng COM trong ứng dụng Nền tảng Windows phổ quát (UWP)?Cách tạo đối tượng COM trong ứng dụng UWP? (C#)

Động lực: Tôi muốn chuyển từ WPF sang UWP. Vì khối lượng công việc của tôi yêu cầu thực hiện cuộc gọi đến thư viện của bên thứ ba chỉ có thể truy cập thông qua COM (cho đến khi tôi biết), tôi cần thực hiện cuộc gọi COM từ UWP.

Bối cảnh:

  • C#
  • NET
  • Visual Studio 2015
  • Windows 10
  • Lý tưởng nhất là nhắm mục tiêu tất cả các thiết bị UWP, nhưng không quan trọng nếu bị hạn chế để máy tính để bàn/máy tính xách tay.

nền

Trong Visual Studio 2013 ("Classic Desktop" dự án trong Visual Studio 2015), tôi đã sử dụng mã C#

// Conceptual: 
DotNetInterface comObjectInstance = 
    (DotNetInterface)Microsoft.VisualBasic.Interaction.CreateObject(
     "this string specified the COM object type" 
    ); 

// Example: Open Excel via COM: 
Excel.Application oApp = (Excel.Application)Interaction.CreateObject("Excel.Application"); 

Các Studio dự án Visual cần một tham chiếu đến Microsoft.VisualBasic sử dụng Interaction.CreateObject() và thư viện kiểu đối tượng COM.

Tôi muốn sử dụng mã C# này trong ứng dụng nền tảng Windows phổ biến (UWP) được sản xuất bởi Visual Studio 2015 Enterprise trên Windows 10 Education. Tôi có thể thêm một tham chiếu đến thư viện kiểu đối tượng COM, nhưng không thể tham chiếu Microsoft.VisualBasic vì nó không xuất hiện trong Trình quản lý tham chiếu của Visual Studio.

Suy nghĩ, cố gắng giải pháp, đầu cơ, vv

tôi đã thêm một tham chiếu đến "Windows Extensions Desktop cho UWP" hy vọng rằng nó có thể cho phép các cuộc gọi đến các tính năng bình thường .NET, nhưng chưa tìm ra làm thế nào để sử dụng nó được nêu ra.

Tôi thấy rằng ngay cả khi các ứng dụng UWP về cơ bản không thể thực hiện cuộc gọi COM, thì ít nhất chúng ta cũng có thể xây dựng một trình bao bọc gọi chương trình .NET bình thường (ngay cả khi qua các cổng mạng). Cuộc gọi COM. Vì nó rõ ràng có thể làm việc xung quanh ngay cả trong kịch bản trường hợp xấu nhất, tôi cảm thấy như có nên (và có lẽ là) một giải pháp do Microsoft cung cấp để tạo các đối tượng COM. Nhưng tôi đoán từ khi UWP quá mới, tài liệu trực tuyến khá thưa thớt và khó tìm ngay bây giờ.

Update # 1

Tìm thấy một bài báo MSDN, Win32 and COM for Windows Runtime apps and Universal Windows Platform (UWP) apps, mà tuyên bố rằng các ứng dụng WinRT (trong đó bao gồm các ứng dụng UWP) chỉ có thể sử dụng một tập hợp con của các đối tượng COM. MSDN đề nghị sử dụng một phần tử COM API được hỗ trợ hoặc di chuyển từ một API COM không được hỗ trợ sang một sự thay thế chức năng.

Tôi đã có thể tìm thấy bài viết này bằng cách googling một lỗi thời gian chạy ném sau khi tôi tìm thấy một cách để thực hiện cuộc gọi COM đến thư viện bên thứ ba của tôi.Lỗi:

An exception of type 'System.Runtime.InteropServices.COMException' occurred in mscorlib.ni.dll but was not handled in user code

Additional information: Creating an instance of the COM component with CLSID {[edit: GUID removed]} using CoCreateInstanceFromApp failed due to the following error: 80040154 Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)). Please make sure your COM object is in the allowed list of CoCreateInstanceFromApp.

Tôi vẫn không chắc chắn có hay không có cách tích hợp để truy cập API COM cho thư viện của bên thứ ba. Nếu không có, nó có thể có nghĩa là tôi sẽ phải làm cho wrapper của riêng tôi bằng cách sử dụng cổng mạng hoặc một cái gì đó, mà có vẻ sai.

Trả lời

12

Khi bạn lưu ý, bạn không thể truy cập các đối tượng COM tùy ý từ ứng dụng Universal Windows. Có thể thư viện bên thứ ba của bạn cũng sử dụng API không có sẵn trực tiếp từ bên trong Windows Runtime.

Giả sử bạn có ý định tải ứng dụng thay vì triển khai thông qua cửa hàng, bạn có thể gọi đối tượng COM và thư viện gián tiếp thông qua Brokered Windows Runtime Components for side-loaded Windows Store apps (tài liệu dành cho Windows 8.1 nhưng vẫn hợp lệ cho Windows 10). Tính năng này được thiết kế cho các ứng dụng doanh nghiệp để cung cấp giao diện người dùng hiện đại trong khi vẫn có quyền truy cập vào chức năng hiện có.

Nếu bạn muốn triển khai thông qua cửa hàng, bạn sẽ bị hạn chế đối với API được phép trong ngữ cảnh Windows Runtime và không thể sử dụng Thành phần Windows Runtime môi giới.

Nếu mục tiêu chính của bạn là triển khai thông qua cửa hàng và bạn không cần chuyển đổi sang ứng dụng Universal thì hãy xem Windows Bridge for Classic Windows apps (also called ”Project Centennial”) sắp tới sẽ cho phép đóng gói hiện tại của bạn.Net dự án triển khai cửa hàng và sẽ cho phép mở rộng nó để sử dụng một số khả năng UWP.

+0

Bạn đang tập trung vào các ứng dụng dành cho doanh nghiệp, do đó không có khả năng sử dụng Cửa hàng không quan trọng. Cảm ơn bạn đã liên kết đến các thành phần Windows Runtime Brokered - đó chính xác là những gì tôi đang tìm kiếm! – Nat

+2

Tôi đã tạo mẫu cho thành phần được môi giới cho ứng dụng Cửa sổ chung. Kiểm tra bài đăng của tôi tại đây https://xamltips.wordpress.com/2015/11/13/brokered-component-for-uwp-on-windows-10/ – Lance

1

Bạn chắc chắn biết rằng ứng dụng UWP là ứng dụng đóng hộp cát, họ cần có quyền làm hầu hết mọi thứ. Ví dụ, họ không thể truy cập toàn bộ hệ thống tập tin, nhưng chỉ có một vùng lưu trữ sandboxed. Khi bạn muốn một ứng dụng được xuất bản trong Windows Store, Bộ chứng nhận ứng dụng sẽ kiểm tra xem ứng dụng của bạn có làm được những gì không được phép thực hiện hay không.

Liên kết bạn cung cấp (Win32 và COM cho ứng dụng Windows Runtime ...) mô tả danh sách các cuộc gọi WIN32/COM được cho phép. Microsoft cho phép bạn gọi những phương thức này và chỉ có chúng.

Sử dụng Visual Basic COM Object có vẻ là ngoài tầm với ...

này là về hạn chế bảo mật, mà còn về các tính năng có sẵn: ví dụ, không có cách nào để đăng ký một đối tượng COM trên Windows Điện thoại (regsrvr32).

Bạn có thể call any COM object (or Win32 API) trong C# trong ứng dụng WPF và trong C++ tất nhiên. Bạn không chắc chắn điều gì sẽ xảy ra nếu bạn cố sao chép/dán loại mã này trong ứng dụng UWP. Bạn sẽ có thể chạy mã trên Windows Desktop, nhưng bạn chắc chắn sẽ không thể gửi ứng dụng của mình lên Windows Store và nó sẽ không hoạt động trên các nền tảng UWP khác. Microsoft doesn't give many details about calling COM objects from UWP app.

Tôi đoán rằng UWP không phù hợp/thích nghi/tương thích với các đối tượng COM "cũ" ... Tôi không chắc liệu việc di chuyển từ WPF sang UWP sẽ mang lại cho bạn?

0

UWP hoặc Windows Universal Application không giống như giải pháp phù hợp tại đây. UWP không cho phép COM vì nó không có sẵn trên tất cả các nền tảng. Tôi giả định rằng bạn muốn sử dụng cửa sổ cửa sổ cho một cơ chế triển khai của ứng dụng WPF hiện tại của bạn. Windows 10 cung cấp những gì mà Microsoft gọi là cầu nối cho các ứng dụng WPF nơi bạn có thể triển khai ứng dụng WPF của bạn như một gói ứng dụng trong cửa sổ windows.

Hy vọng rằng bạn sẽ có rất ít để viết lại với giải pháp này

Để biết thêm thông tin về làm thế nào để triển khai một ứng dụng WPF trong một tập tin phụ lục xem video sau đây. https://channel9.msdn.com/Events/Build/2015/2-692

0

Trên trang khác, cách UWP/WinRT có vẻ là cách duy nhất MS đang diễn ra ở đó vì lý do bảo mật. Tôi không biết nếu Sandbox có thể phát hiện trên một đối tượng COM tùy chỉnh trường cũ được gọi từ đối tượng được phép không cho phép hành động. Tôi hy vọng điều này là có thể cho Sandbox.

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