Я создал этот простой образец формы с кнопкой закрытия.
Все работает как положено, когда НЕ используется Interop.WMPLib.dll
Я видел другие приложения, использующие это без проблем, но почему процесс Form не закрывается, когда я просто добавляю строку:
SoundPlayer myPlayer = new SoundPlayer();
и, конечно, распоряжаться им:
if (myPlayer != null)
{
myPlayer.Dispose();
myPlayer = null;
}
Форма закрывается, но отладчик VS2008 все еще активен. Проект Form и dll все еще активны.
Если вы отправите мне электронное письмо по адресу xdasleepsense@gmail.com, я отправлю вам сжатый проект.
Ниже приведен класс для DLL:
с использованием системы;
using System.Collections.Generic;
используя System.Text;
используя System.Threading;
using System.Runtime.InteropServices;
используя WMPLib;
пространство имен WindowsMobile.Utilities
{
открытый делегат void SoundPlayerStateChanged (отправитель SoundPlayer, SoundPlayerState newState);
public enum SoundPlayerState
{
Stopped,
Playing,
Paused,
}
public class SoundPlayer : IDisposable
{
[DllImport("coredll")]
public extern static int waveOutSetVolume(int hwo, uint dwVolume);
[DllImport("coredll")]
public extern static int waveOutGetVolume(int hwo, out uint dwVolume);
WindowsMediaPlayer myPlayer = new WindowsMediaPlayer();
public SoundPlayer()
{
myPlayer.uiMode = "invisible";
myPlayer.settings.volume = 100;
}
string mySoundLocation = string.Empty;
public string SoundLocation
{
get { return mySoundLocation; }
set { mySoundLocation = value; }
}
public void Pause()
{
myPlayer.controls.pause();
}
public void PlayLooping()
{
Stop();
myPlayer.URL = mySoundLocation;
myPlayer.settings.setMode("loop", true);
}
public int Volume
{
get { return myPlayer.settings.volume; }
set { myPlayer.settings.volume = value; }
}
public void Play()
{
Stop();
myPlayer.URL = mySoundLocation;
myPlayer.controls.play();
}
public void Stop()
{
myPlayer.controls.stop();
myPlayer.close();
}
#region IDisposable Members
public void Dispose()
{
try
{
Stop();
}
catch (Exception)
{
}
// need this otherwise the process won't exit?!
try
{
int ret = Marshal.FinalReleaseComObject(myPlayer);
}
catch (Exception)
{
}
myPlayer = null;
GC.Collect();
}
#endregion
}
}