web-dev-qa-db-ja.com

UWPアプリケーションでCOMオブジェクトを作成するにはどうすればよいですか? (C#)

質問:ユニバーサルWindowsプラットフォーム(UWP)アプリケーションでCOMオブジェクトを作成するにはどうすればよいですか?

モチベーション:WPFからUWPに切り替えたい。私のワークロードでは、COMを介してのみアクセス可能なサードパーティライブラリへの呼び出しを行う必要があるため(私が知る限り)、UWPからCOM呼び出しを行う必要があります。

コンテキスト:

  • C#
  • 。ネット
  • Visual Studio 2015
  • ウィンドウズ10
  • 理想的にはすべてのUWPデバイスを対象としていますが、デスクトップ/ラップトップに限定されていれば問題ありません。

背景

Visual Studio 2013(Visual Studio 2015の「クラシックデスクトップ」プロジェクト)では、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");
_

Visual Studioプロジェクトでは、 Interaction.CreateObject() とCOMオブジェクトのタイプライブラリを使用するために_Microsoft.VisualBasic_への参照が必要でした。

このC#コードを、Windows 10Education上のVisualStudio 2015 Enterpriseによって作成されたユニバーサルWindowsプラットフォーム(UWP)アプリケーションで使用したいと思います。 COMオブジェクトのタイプライブラリへの参照を追加することはできますが、Visual Studioのリファレンスマネージャーに表示されないため、_Microsoft.VisualBasic_を参照できません。

考え、試行された解決策、推測など

「UWP用のWindowsデスクトップ拡張機能」への参照を追加して、通常の.NET機能への呼び出しが可能になることを期待しましたが、その使用方法はまだわかりません。

UWPアプリケーションが基本的にCOM呼び出しを行うことができない場合でも、少なくとも通常の.NETプログラムを呼び出すラッパーを構築して(ネットワークポート経由であっても)、COM呼び出しを実行できると思います。最悪のシナリオでも回避できることは明らかなので、COMオブジェクトを作成するためのMicrosoft提供のソリューションがあるはずです(おそらくそうなるでしょう)。しかし、UWPは非常に新しいため、オンラインドキュメントはかなりまばらで、現時点では見つけるのが難しいと思います。

アップデート#1

WinRTアプリ(UWPアプリを含む)はCOMオブジェクトのサブセットのみを使用できると主張するMSDNの記事 WindowsランタイムアプリおよびユニバーサルWindowsプラットフォーム(UWP)アプリ用のWin32およびCOM を見つけました。 MSDNは、サポートされているCOM API要素を使用するか、サポートされていないCOMAPIから機能的な置換に移行することをお勧めします。

サードパーティのライブラリにCOM呼び出しを行う方法を見つけた後にスローされた実行時エラーをグーグルで検索することで、この記事を見つけることができました。エラー:

タイプ 'System.Runtime.InteropServices.COMException'の例外がmscorlib.ni.dllで発生しましたが、ユーザーコードでは処理されませんでした

追加情報:CoCreateInstanceFromAppを使用したCLSID {[編集:GUID削除]}でのCOMコンポーネントのインスタンスの作成は、次のエラーのために失敗しました:80040154クラスが登録されていません(HRESULTからの例外:0x80040154(REGDB_E_CLASSNOTREG ))。COMオブジェクトがCoCreateInstanceFromAppの許可リストに含まれていることを確認してください。

サードパーティライブラリのCOMAPIにアクセスするための組み込みの方法があるかどうかはまだわかりません。そうでない場合は、ネットワークポートなどを使用して独自のラッパーを作成する必要がある可能性がありますが、これは間違っているようです。

11
Nat

お気づきのとおり、ユニバーサルWindowsアプリから任意のCOMオブジェクトにアクセスすることはできません。サードパーティのライブラリも、Windowsランタイム内から直接利用できないAPIを使用している可能性があります。

ストアを介してデプロイするのではなく、アプリをサイドロードする場合は、COMオブジェクトとライブラリを サイドロードされたWindowsストアアプリ用のブローカー化されたWindowsランタイムコンポーネント (Windows 8.1のドキュメントですが、引き続き有効です)を介して間接的に呼び出すことができます。 Windows 10の場合)。この機能は、既存の機能にアクセスしながら、最新のUIを提供するエンタープライズアプリ向けに設計されています。

ストアを介して展開する場合は、Windowsランタイムコンテキストで許可されているAPIに制限されたままになり、ブローカー化されたWindowsランタイムコンポーネントを使用できません。

主な目標がストアを介して展開することであり、ユニバーサルアプリに変換する必要がない場合は、次の予定を確認してください クラシックWindowsアプリ用のWindowsブリッジ(「プロジェクトセンテニアル」とも呼ばれます) =これにより、現在の.Netプロジェクトをストア展開用にパッケージ化し、一部のUWP機能を使用するように拡張できます。

15

UWPアプリはサンドボックス化されたアプリであり、ほとんどすべてを実行するには許可が必要です。たとえば、ファイルシステム全体にアクセスすることはできませんが、サンドボックス化されたストレージ領域にのみアクセスできます。アプリをWindowsストアで公開する場合、アプリ認定キットは、アプリが許可されていないことを実行していないことを確認します。

指定したリンク(Windowsランタイムアプリの場合はWin32およびCOM ...)は、許可されるWIN32/COM呼び出しのリストを示しています。 Microsoftでは、これらのメソッドのみを呼び出すことができます。

Visual BasicCOMオブジェクトの使用は手の届かないようです...

これはセキュリティ制限に関するものですが、利用可能な機能に関するものでもあります。たとえば、Windows Phone(regsrvr32)にCOMオブジェクトを登録する方法はありません。

任意のCOMオブジェクト(またはWin32 API)を呼び出す WPFアプリケーションのC#、そしてもちろんC++で実行できます。この種のコードをUWPアプリでコピーして貼り付けようとすると、どうなるかわかりません。 Windowsデスクトップでコードを実行できる場合もありますが、アプリをWindowsストアに送信できるとは限らず、他のUWPプラットフォームでは機能しません。 Microsoft WPアプリからのCOMオブジェクトの呼び出しに関する詳細はあまり説明していません

UWPは、「古い」COMオブジェクトとの適合性/適応性/互換性があまり良くないと思います...このWPFからUWPへの移行によって何がもたらされるかわかりませんか?

1
Dazzibao

他のサイトでは、セキュリティ上の理由から、MSがOSで実行している唯一の方法はUWP/WinRTの方法のようです。サンドボックスが、許可されたオブジェクトから呼び出された古い学校のカスタムCOMオブジェクトで、許可されていないアクションを検出できるかどうかはわかりません。これがサンドボックスで可能であることを願っています。

0
user8923303

UWPまたはWindowsユニバーサルアプリケーションは、ここでは適切なソリューションのようには思えません。 UWPは、すべてのプラットフォームで使用できるわけではないため、COMを許可していません。現在のWPFアプリケーションの展開メカニズムにWindowsストアを使用することを想定しています。 Windows 10は、MicrosoftがWPFアプリケーションのブリッジと呼んでいるものを提供します。このブリッジでは、WPFアプリケーションをappxパッケージとしてWindowsストアに展開できます。

うまくいけば、このソリューションで書き直すことはほとんどありません

WPFアプリケーションをAPPxファイルに展開する方法の詳細については、次のビデオを参照してください。 https://channel9.msdn.com/Events/Build/2015/2-692

0
Stuart Smith