1. fujieda

    Posted

    fujieda
Changes in title
+.NET FrameworkでWindows Media Player Controlを利用するもう一つの方法
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,20 @@
+.NET Frameworkでサウンドを再生するときには、Windows Media Player Controlを利用すると、さまざまな形式のファイルを利用できて便利です。その方法は[DOBON.NETに解説があります](http://dobon.net/vb/dotnet/programing/playmidifile.html#wmp)。しかしこの方法を使うアプリケーションには、自動的に生成されるInterop.WMPLib.dllとAxInterop.WMPLib.dllの二つのCOM Interop DLLを、アプリケーションに同梱しなければなりません。
+
+.NET Framework 4には、COM Interop DLLなしでCOMコンポーネントを利用可能にするEmbedded Interop Types (相互運用機能型の埋め込み)があります。しかし、Windows Media Player Controlはこの方法に必要な要件を満たしていないので、利用すると以下のようなエラーになってしまいます。
+
+> アセンブリ 'Hoge\obj\Release\AxInterop.WMPLib.dll' に 'ImportedFromTypeLibAttribute' 属性または 'PrimaryInteropAssemblyAttribute' 属性が指定されていないため、このアセンブリから相互運用機能型を埋め込むことはできません
+> アセンブリ 'Hoge\obj\Release\AxInterop.WMPLib.dll' に 'GuidAttribute' 属性が指定されていないため、このアセンブリから相互運用機能型を埋め込むことはできません
+
+この問題を解決するには、.NET Framework 4のdynamic型を使ってCOMコンポーネントを利用すればよいです。具体的には以下のように記述します。
+
+```java
+private readonly dynamic _wmp = Activator.CreateInstance(Type.GetTypeFromProgID("WMPlayer.OCX.7"));
+
+private void button1_Click(object sender, EventArgs e)
+{
+ _wmp.URL = soundFile;
+ _wmp.controls.play();
+}
+```
+
+これはDOBON.NETのWMPLib.WindowsMediaPlayerオブジェクトを使う例のオブジェクトの生成を、ActivatorによるCOMインスタンスの生成に置き換えたものです。音量の設定や各種イベントハンドラーの登録など、WindowsMediaPlayerオブジェクトとまったく同様に記述できます。この方法ではAxWMPLibとWMPLibの参照設定はいりません。