none
UWPアプリからも使用できるWin32 DLLの開発は可能か RRS feed

  • 質問

  • お世話になっております。

    デスクトップアプリだけでなく、UWPアプリからも使用できるWin32 DLL (ネイティブDLL) を開発、提供することは可能でしょうか。

    ここで、Win32 DLLでは、デスクトップアプリとUWPアプリの両方に対応したWin32 APIだけを使用するものとします。

    以上、宜しくお願い致します。

    2020年2月12日 5:34

回答

  • FYI
    ---------------------------------------------------
    方法: ユニバーサル Windows プラットフォーム アプリで既存の C++ コードを使用する
    https://docs.microsoft.com/ja-jp/cpp/porting/how-to-use-existing-cpp-code-in-a-universal-windows-platform-app?view=vs-2019

    UWP アプリは保護された環境で実行されるため、プラットフォームのセキュリティを損なう可能性がある多くの Win32、COM、および CRT API の呼び出しは許可されていません。 /ZW オプションが使用されていると、コンパイラはこのような呼び出しを検出し、エラーを生成することができます。

    ---------------------------------------------------

    • 編集済み お馬鹿 2020年2月13日 3:00 追記
    • 回答としてマーク cdefg 2020年2月19日 2:09
    2020年2月12日 8:01
  • ローカルでビルドするだけであれば別に読み込めると思いますが、ストアの審査には通らないかもしれません。
    LoadLibrary および LoadLibraryEx は承認されていない API だと、海外のスレッドで言及されています ので。

    ----

    They are just processes with limited ACLs. API validation is performed by the WACK tool which examines the DLL imports/exports from the package EXE and  the package DLLs against the approved list of APIs. Arbitrary DLL loading *outside* of the package is not supported (hence why LoadLibrary/LoadLibraryEx itself is not an approved API).

    ----

    別記事:https://stackoverflow.com/questions/33489924/can-you-use-c-dlls-in-c-sharp-code-in-a-uwp
    C# の DllImport の場合、禁止された API を使っていなければ、content に含めておけば OK とも読めますね。
    UWP の場合は内部的に LoadPackagedLibrary に変わるのかな?

    Firstly, UWP can't consume a legacy C++ dll just by DLLImport.
    (中略)

    If you want to PInvoke the dll, you can follow these steps (You can refer to this MSDN post):
    1. Add win32 dll into your UWP project making sure to set its type as 'content'
    2. Then in the proper cs file, using DllImport to PInvoke the dll.
    2020年2月13日 12:36
    モデレータ

すべての返信

  • FYI
    ---------------------------------------------------
    方法: ユニバーサル Windows プラットフォーム アプリで既存の C++ コードを使用する
    https://docs.microsoft.com/ja-jp/cpp/porting/how-to-use-existing-cpp-code-in-a-universal-windows-platform-app?view=vs-2019

    UWP アプリは保護された環境で実行されるため、プラットフォームのセキュリティを損なう可能性がある多くの Win32、COM、および CRT API の呼び出しは許可されていません。 /ZW オプションが使用されていると、コンパイラはこのような呼び出しを検出し、エラーを生成することができます。

    ---------------------------------------------------

    • 編集済み お馬鹿 2020年2月13日 3:00 追記
    • 回答としてマーク cdefg 2020年2月19日 2:09
    2020年2月12日 8:01
  • 回答ありがとうございます。

    頂いたURLのドキュメントを確認しましたが、UWPアプリでWin32のDLLを使用する場合、DLLのソースを移植しUWPプロジェクトとして認識させるとなっており、Win32 DLLをそのままUWPアプリから使用することについては言及されていないようでした。(Win32 DLLをプロジェクトに含み、LoadPackagedLibraryを使用する方法については、ユーザアプリ負担が大きく難しいです)

    実際にC#のUWPアプリからP/InvokeによりWin32 DLLにアクセスしてみたところ、問題なくアクセスできていますが、この手法が設計的に正しいか (保証されているか) が疑問なので、質問させて頂いております。

    2020年2月13日 2:22
  • ローカルでビルドするだけであれば別に読み込めると思いますが、ストアの審査には通らないかもしれません。
    LoadLibrary および LoadLibraryEx は承認されていない API だと、海外のスレッドで言及されています ので。

    ----

    They are just processes with limited ACLs. API validation is performed by the WACK tool which examines the DLL imports/exports from the package EXE and  the package DLLs against the approved list of APIs. Arbitrary DLL loading *outside* of the package is not supported (hence why LoadLibrary/LoadLibraryEx itself is not an approved API).

    ----

    別記事:https://stackoverflow.com/questions/33489924/can-you-use-c-dlls-in-c-sharp-code-in-a-uwp
    C# の DllImport の場合、禁止された API を使っていなければ、content に含めておけば OK とも読めますね。
    UWP の場合は内部的に LoadPackagedLibrary に変わるのかな?

    Firstly, UWP can't consume a legacy C++ dll just by DLLImport.
    (中略)

    If you want to PInvoke the dll, you can follow these steps (You can refer to this MSDN post):
    1. Add win32 dll into your UWP project making sure to set its type as 'content'
    2. Then in the proper cs file, using DllImport to PInvoke the dll.
    2020年2月13日 12:36
    モデレータ
  • UWPからWin32 DLLへのアクセスは、基本的には禁止されているが、/ZWをパスしたDLLなら可能ということですね。

    マイクロソフトが推奨していない以上、UWPユーザとデスクトップユーザには、それぞれUWPのDLLとWin32 DLLを区別して提供するのが本筋の気がしてきましたが、もう少し調べてみようと思います。

    情報提供ありがとうございました。

    2020年2月14日 7:32
  • cdefgさん、こんにちは。フォーラムオペレーターのクモです。
    MSDNフォーラムにご投稿くださいましてありがとうございます。

    本件、皆様より参考になる投稿が寄せられたようでなによりです。

    [回答としてマーク]機能は設定された投稿が後から参照しやすくなりますので、
    同じ問題でお困りの方のためにも参考になった投稿に設定いただけますと幸いです。

    お手数ですが、ご協力の程どうかよろしくお願いいたします。

    引き続きMSDNフォーラムをご利用いただけますようお願い申し上げます。

    MSDN/ TechNet Community Support Kumo ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~

    2020年2月17日 7:50
    モデレータ