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

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

概要

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

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

Visual Studioを起動し、プロジェクトを作成します。今回はWindows Formアプリケーションのプロジェクトを作成しました。
PortableDeviceApi のCOMオブジェクトを参照に追加する:画像1

ソリューション エクスプローラーのウィンドウでプロジェクトのノードを開き、[参照]ノードをクリックして選択します。
PortableDeviceApi のCOMオブジェクトを参照に追加する:画像2

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

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

[参照]ノードに"PortableDeviceApiLib"と"PortableDeviceTypesLib"が追加できました。
PortableDeviceApi のCOMオブジェクトを参照に追加する:画像5

Interop.PortableDeviceApiLib.dllの修正

ディスアセンブル

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

PortableDeviceApi のCOMオブジェクトを参照に追加する:画像6

ファイルを別のディレクトリ(作業ディレクトリ)にコピーしました。
PortableDeviceApi のCOMオブジェクトを参照に追加する:画像7

コマンドプロンプトまたは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

PortableDeviceApi のCOMオブジェクトを参照に追加する:画像8

コマンドを実行します。成功した場合でもメッセージは表示されません。
PortableDeviceApi のCOMオブジェクトを参照に追加する:画像9

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

PortableDeviceApi のCOMオブジェクトを参照に追加する:画像10

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

pdapi.il をVisual Studioで開きます。
PortableDeviceApi のCOMオブジェクトを参照に追加する:画像11

ilファイルのコードを置換をします。

GetDevices([in][out] string& marshal( lpwstr) pPnPDeviceIDs,

GetDevices([in][out] string[] marshal( lpwstr[]) pPnPDeviceIDs,
に置換します。

PortableDeviceApi のCOMオブジェクトを参照に追加する:画像12

2か所置換できました。
PortableDeviceApi のCOMオブジェクトを参照に追加する:画像13

続いて以下のコードを置換します。

[in][out] uint16&

[in][out] uint16[] marshal([])
に置換します。

PortableDeviceApi のCOMオブジェクトを参照に追加する:画像14

7か所置換できました。
PortableDeviceApi のCOMオブジェクトを参照に追加する:画像15


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

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

修正した pdapi.il ファイルをコンパイルします。作業フォルダの Interop.PortableDeviceApiLib.dll をリネームします。今回は Interop.PortableDeviceApiLib-org.dll にリネームします。
PortableDeviceApi のCOMオブジェクトを参照に追加する:画像16

コマンドプロンプトまたは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

PortableDeviceApi のCOMオブジェクトを参照に追加する:画像17

コンパイルに成功すると "Operation completed successfully" のメッセージが表示されます。
PortableDeviceApi のCOMオブジェクトを参照に追加する:画像18

pdapi.il のある作業フォルダを確認します。Interop.PortableDeviceApiLib.dll が生成されていることが確認できます。
PortableDeviceApi のCOMオブジェクトを参照に追加する:画像19

PortableDeviceApiLib の参照の置き換え

PortableDeviceApiLib の参照を修正したInterop.PortableDeviceApiLib.dll に置き換えます。ソリューションエクスプローラーのウィンドウで[参照]ノード内のPortableDeviceApiLib のノードをクリックして選択します。右クリックしてポップアップメニューを表示します。メニューの[削除]をクリックします。
PortableDeviceApi のCOMオブジェクトを参照に追加する:画像20

PortableDeviceApiLib の参照が削除できました。
PortableDeviceApi のCOMオブジェクトを参照に追加する:画像21

再度ソリューションエクスプローラーで[参照]ノードをクリックして選択し、右クリックします。ポップアップメニューの[参照の追加]ボタンをクリックします。
PortableDeviceApi のCOMオブジェクトを参照に追加する:画像22

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

[参照するファイルの選択]ダイアログが表示されます。先の手順で修正した Interop.PortableDeviceApiLib.dll ファイルを選択します。
PortableDeviceApi のCOMオブジェクトを参照に追加する:画像24

参照したファイルがダイアログに表示されます。項目の左側のチェックボックスをクリックしてチェックを付けます。チェック後ダイアログ右下の[OK]ボタンをクリックします。
PortableDeviceApi のCOMオブジェクトを参照に追加する:画像25

Interop.PortableDeviceApiLibの参照が追加されました。
PortableDeviceApi のCOMオブジェクトを参照に追加する:画像26

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

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

参考URL

http://andrewt.com/2013/06/15/fun-with-mtp-in-c.html

AuthorPortraitAlt
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
作成日: 2018-08-12
Copyright © 1995–2025 iPentec all rights reserverd.