Я использую COM Wrapper для взаимодействия с проигрывателем Windows Media.
Он использует AxHost, чтобы каким-то образом обернуть игрока, для меня это просто волшебство под капотом ^^
AxHost.AttachInterfaces выглядит так
protected override void AttachInterfaces()
{
try
{
//Get the IOleObject for Windows Media Player.
IOleObject oleObject = this.GetOcx() as IOleObject;
//Set the Client Site for the WMP control.
oleObject.SetClientSite(this as IOleClientSite);
Player = this.GetOcx() as WMPLib.WindowsMediaPlayer;
...
Все работает, пока я размещаю этот AxHost в элементе управления Windows Forms. Но я не могу подключить события в конструкторе.
Это, например, не работает:
public WMPMediaRating()
{
var remote = new WMPRemote.RemotedWindowsMediaPlayer();
_WMP = remote.Player;
_WMP.MediaChange += new _WMPOCXEvents_MediaChangeEventHandler(_WMP_MediaChange);
}
remote.Player всегда имеет значение null, и программа вылетает из-за исключения NullReferencesException.
Код в AttachInterfaces () каким-то образом выполняется только после того, как форма была нарисована, или после того, как все остальное будет сделано.
Я пробовал вызвать AttachInterfaces () вручную, но это тоже не сработало, потому что GetOcx () ничего не возвращает.
Итак, как я могу создать экземпляр элемента управления, унаследованного от AxHost, без Windows Forms, чтобы использовать его, например, в консольном приложении?





К вашему сведению: никто не мешает вам использовать скрытое окно в консольном приложении.
Вы не сможете разместить медиаплеер в приложении, отличном от Windows - для этого требуется хостинг. Если вы хотите воспроизвести музыку, вы можете использовать Media Graphs, чтобы создать график, который отображает (воспроизводит) ваш музыкальный файл - для этого не потребуется никакого дополнительного хостинга.