2015-08-17 74 views
10

Domanda: Come creare un oggetto COM in un'applicazione Universal Windows Platform (UWP)?Come creare un oggetto COM in un'applicazione UWP? (C#)

Motivazione: Voglio passare da WPF a UWP. Poiché il mio carico di lavoro richiede l'esecuzione di chiamate a librerie di terze parti accessibili solo tramite COM (per quanto ne so), ho bisogno di effettuare chiamate COM da UWP.

Contesto:

  • C#
  • .NET
  • Visual Studio 2015
  • di Windows 10
  • Idealmente rivolto a tutti i dispositivi UWP, ma va bene se limitato al desktop/laptop.

Sfondo

In Visual Studio 2013 ("Classic Desktop" progetto in Visual Studio 2015), ho usato il codice 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"); 

Il progetto di Visual Studio richiesto un riferimento alla Microsoft.VisualBasic utilizzare Interaction.CreateObject() e la libreria dei tipi dell'oggetto COM.

Desidero utilizzare questo codice C# in un'applicazione Universal Windows Platform (UWP) prodotta da Visual Studio 2015 Enterprise su Windows 10 Education. Sono in grado di aggiungere un riferimento alla libreria dei tipi dell'oggetto COM, ma non sono in grado di fare riferimento a Microsoft.VisualBasic poiché non viene visualizzato in Reference Manager di Visual Studio.

Pensieri, cercato soluzioni, la speculazione, ecc

ho aggiunto un riferimento a "Estensioni per il desktop di Windows per l'UWP" sperando che potrebbe consentire chiamate verso normali caratteristiche di .NET, ma non ho capito come usarlo ancora.

Immagino che anche se le applicazioni UWP fondamentalmente non possono effettuare chiamate COM, allora potremmo almeno costruire un wrapper che chiama un normale programma .NET (anche se attraverso le porte di rete) che a sua volta sarà in grado di eseguire il Chiamata COM Dal momento che è chiaramente possibile aggirare anche nel peggiore dei casi, penso che ci dovrebbe essere (e probabilmente lo è) una soluzione fornita da Microsoft per creare oggetti COM. Ma credo che dal momento che UWP è così nuovo, la documentazione online è piuttosto scarsa e difficile da trovare in questo momento.

Update # 1

trovato un articolo di MSDN, Win32 and COM for Windows Runtime apps and Universal Windows Platform (UWP) apps, che sostiene che le applicazioni WinRT (che comprende le applicazioni UWP) possono utilizzare solo un sottoinsieme di oggetti COM. MSDN suggerisce di utilizzare un elemento API COM supportato o di migrare da un'API COM non supportata a una sostituzione funzionale.

Sono stato in grado di trovare questo articolo cercando su google un errore in fase di esecuzione dopo aver trovato un modo per effettuare una chiamata COM alla libreria di terze parti.L'errore:

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.

io sono ancora incerti circa se o non c'è un modo incorporato per accedere alle API COM per le mie librerie di terze parti. Se non c'è, potrebbe significare che dovrò creare il mio wrapper usando le porte di rete o qualcosa del genere, il che sembra sbagliato.

risposta

12

Come si nota, non è possibile accedere a oggetti COM arbitrari da un'app di Windows universale. È probabile che le tue librerie di terze parti utilizzino anche API che non sono disponibili direttamente da Windows Runtime.

Supponendo che si intende caricare l'applicazione anziché eseguire la distribuzione attraverso lo store, è possibile chiamare gli oggetti e le librerie COM indirettamente tramite un Brokered Windows Runtime Components for side-loaded Windows Store apps (documenti per Windows 8.1 ma ancora valido per Windows 10). Questa funzione è progettata per le app aziendali che forniscono un'interfaccia utente moderna pur avendo accesso alle funzionalità esistenti.

Se si desidera eseguire la distribuzione attraverso lo store, resterà limitato all'API consentita nel contesto di Windows Runtime e non è possibile utilizzare un componente di Runtime di Windows Broker.

Se l'obiettivo principale è quello di distribuire attraverso lo store e non è necessario convertirlo in un'app universale, quindi dare un'occhiata all'imminente Windows Bridge for Classic Windows apps (also called ”Project Centennial”) che consentirà di impacchettare la corrente.Progetto di rete per l'implementazione del negozio e consentirà di estenderlo per utilizzare alcune funzionalità UWP.

+0

Hai ragione riguardo l'attenzione per le app aziendali, quindi l'impossibilità di utilizzare lo Store non è critica. Grazie per il collegamento ai Componenti di Runtime di Windows Brokered: è esattamente quello che stavo cercando! – Nat

+2

Ho creato un modello per il componente mediato per l'app di Windows universale. Controlla il mio post qui https://xamltips.wordpress.com/2015/11/13/brokered-component-for-uwp-on-windows-10/ – Lance

1

Sicuramente sai che le app UWP sono app in scatola di sabbia, hanno bisogno di un permesso per fare quasi tutto. Ad esempio, non possono accedere all'intero file system, ma solo un'area di archiviazione in modalità sandbox. Quando si desidera pubblicare un'app in Windows Store, il Kit di certificazione app verifica che l'app non esegua ciò che non è autorizzato a fare.

Il collegamento fornito (Win32 e COM per le applicazioni di runtime di Windows ...) descrive un elenco di chiamate WIN32/COM consentite. Microsoft ti consente di chiamare questi metodi e solo loro.

Utilizzando un oggetto COM di Visual Basic sembra essere fuori portata ...

Si tratta di restrizioni di sicurezza, ma anche di funzioni disponibili: per esempio, non v'è alcun modo per registrare un oggetto COM su un sistema Windows Telefono (regsrvr32).

È possibile call any COM object (or Win32 API) in C# in un'applicazione WPF e in C++, naturalmente. Non sai cosa succede se provi a copiare/incollare questo tipo di codice in un'app UWP. Potresti riuscire a eseguire il codice su Windows Desktop, ma non sarai certo in grado di inviare la tua app a Windows Store e non funzionerà su altre piattaforme UWP. Microsoft doesn't give many details about calling COM objects from UWP app.

Immagino che UWP non sia molto adatto/adattato/compatibile con "vecchi" oggetti COM ... Non sono sicuro di ciò che ti porterà questa migrazione da WPF a UWP?

0

UWP o Windows Universal Application non sembrano la soluzione giusta qui. UWP non consente COM perché non è disponibile su tutte le piattaforme. Presumo che desideri utilizzare l'archivio di Windows per un meccanismo di distribuzione della tua attuale applicazione WPF. Windows 10 offre ciò che Microsoft chiama un bridge per le applicazioni WPF in cui è possibile distribuire l'applicazione WPF come pacchetto appx nell'archivio di Windows.

Speriamo che si hanno ben poco di riscrivere con questa soluzione

Per ulteriori informazioni su come distribuire un'applicazione WPF in un file Appx vedere il seguente video. https://channel9.msdn.com/Events/Build/2015/2-692

0

Sull'altro sito, la modalità UWP/WinRT sembra l'unico modo in cui MS sta accedendo al sistema operativo per motivi di sicurezza. Non so se la Sandbox sarebbe in grado di rilevare su un oggetto COM personalizzato vecchia scuola chiamato da oggetto consentito un'azione non consentita. Spero che questo sia possibile per Sandbox.