PortableDeviceApi のCOMオブジェクトを参照に追加する - C#

C#でPortableDeviceApi を利用するために、PortableDeviceApiのCOMオブジェクトを参照に追加する手順を紹介します。

概要

PortableDeviceApi を利用するためにPortableDeviceApiのCOMオブジェクトを参照に追加しますが、通常の手順で参照に追加しただけでは、不具合があるため正しくCOMオブジェクトのAPIを利用できないことがあります。ここでは、COMオブジェクトを追加する場合に不具合を修正したInterop DLLを作成して参照追加する手順を紹介します。

タイプライブラリ参照の追加

Visual Studioを起動し、プロジェクトを作成します。今回はWindows Formアプリケーションのプロジェクトを作成しました。


ソリューション エクスプローラーのウィンドウでプロジェクトのノードを開き、[参照]ノードをクリックして選択します。


[参照マネージャー]ダイアログが表示されます。左側のツリービューで[COM]のノードを開き、[タイプライブラリ]の項目をクリックして選択します。下図の画面が表示されます。


右側のタイプライブラリのリストを下にスクロールし[PortableDeviceApi 1.0 Type Library]と[PortableDeviceType 1.0 Type Library]の2つの項目をクリックしてチェックを付けます。(下図参照)
チェックができたらダイアログ右下の[OK]ボタンをクリックします。


[参照]ノードに"PortableDeviceApiLib"と"PortableDeviceTypesLib"が追加できました。

Interop.PortableDeviceApiLib.dllの修正

ディスアセンブル

タイプライブラリの参照追加後、プロジェクトの /obj/Debug フォルダを確認します。いくつかのファイルが作成されています。生成されているファイルInterop.PortableDeviceApiLib.dllファイルを別のディレクトリにコピーします。


ファイルを別のディレクトリ(作業ディレクトリ)にコピーしました。


コマンドプロンプトまたはPowerShellのターミナルから下記のコマンドを実行します。Interop.PortableDeviceApiLib.dll は作業ディレクトリにコピーしたdllです。
ildasm Interop.PortableDeviceApiLib.dll /out:pdapi.il
ildasmの場所は事前に調べておく必要があります。今回の環境では C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools にildasmがあったため、実行するコマンドは下記のコマンドでした。
'C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools\ildasm.exe' .\Interop.PortableDeviceApiLib.dll /out:pdapi.il


コマンドを実行します。成功した場合でもメッセージは表示されません。


先ほど Interop.PortableDeviceApiLib.dll をコピーした作業ディレクトリを確認すると pdapi.il ファイルが作成されていることが確認できます。

中間言語 (IL: Intermediate Language)の修正

pdapi.il をVisual Studioで開きます。


ilファイルのコードを置換をします。
GetDevices([in][out] string& marshal( lpwstr) pPnPDeviceIDs,
GetDevices([in][out] string[] marshal( lpwstr[]) pPnPDeviceIDs,
に置換します。


2か所置換できました。


続いて以下のコードを置換します。
[in][out] uint16&
[in][out] uint16[] marshal([])
に置換します。


7か所置換できました。


修正後 pdapi.ilファイルを保存します。

中間言語 (IL: Intermediate Language)のコンパイル

修正した pdapi.il ファイルをコンパイルします。作業フォルダの Interop.PortableDeviceApiLib.dll をリネームします。今回は Interop.PortableDeviceApiLib-org.dll にリネームします。


コマンドプロンプトまたはPowerShellのターミナルから下記のコマンドを実行します。
ilasm pdapi.il /dll /output=Interop.PortableDeviceApiLib.dll
ilasmの場所は事前に調べておく必要があります。今回の環境では .NET Framework 4を利用するアプリケーションのため C:\Windows\Microsoft.NET\Framework64\v4.0.30319 の ilasm を利用します。今回の環境で実行するコマンドは下記のコマンドとなります。
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\ilasm.exe pdapi.il /dll /output =Interop.PortableDeviceApiLib.dll


コンパイルに成功すると "Operation completed successfully" のメッセージが表示されます。


pdapi.il のある作業フォルダを確認します。Interop.PortableDeviceApiLib.dll が生成されていることが確認できます。

PortableDeviceApiLib の参照の置き換え

PortableDeviceApiLib の参照を修正したInterop.PortableDeviceApiLib.dll に置き換えます。ソリューションエクスプローラーのウィンドウで[参照]ノード内のPortableDeviceApiLib のノードをクリックして選択します。右クリックしてポップアップメニューを表示します。メニューの[削除]をクリックします。

PortableDeviceApiLib の参照が削除できました。


再度ソリューションエクスプローラーで[参照]ノードをクリックして選択し、右クリックします。ポップアップメニューの[参照の追加]ボタンをクリックします。


[参照マネージャー]ダイアログが表示されます。左側のツリービューで[COM]ノードを開きの[タイプライブラリ]の項目をクリックします。下図の画面が表示されます。ダイアログ右下の[参照]ボタンをクリックします。


[参照するファイルの選択]ダイアログが表示されます。先の手順で修正した Interop.PortableDeviceApiLib.dll ファイルを選択します。


参照したファイルがダイアログに表示されます。項目の左側のチェックボックスをクリックしてチェックを付けます。チェック後ダイアログ右下の[OK]ボタンをクリックします。


Interop.PortableDeviceApiLibの参照が追加されました。

「相互運用型の埋め込み」の無効化

ソリューションエクスプローラーで追加した参照の[PortableDeviceTypesLib]のノードをクリックして選択します。下部のプロパティウィンドウの[相互運用型の埋め込み]の項目を確認します。値が"True"の場合は"False"に変更します。同様に[Interop.PortableDeviceApiLib]のノードをクリックして、プロパティウィンドウの[相互運用型の埋め込み]の値を確認し、"True"の場合は"False"に変更します。

参考URL

http://andrewt.com/2013/06/15/fun-with-mtp-in-c.html
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2024-01-07
作成日: 2018-08-12
iPentec all rights reserverd.