1. fujieda

    No comment

    fujieda
Changes in body
Source | HTML | Preview
@@ -1,20 +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でサウンドを再生するときは、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の参照設定はいりません。