Как создать AxHost исключительно в коде [C #]
Вопрос
Я использую COM-оболочку для взаимодействия с проигрывателем 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);
}
удаленный.Значение проигрывателя всегда равно нулю, и программа завершает работу с NullReferencesException.
Код в AttachInterfaces() каким-то образом выполняется только после того, как Форма была нарисована, или после того, как все остальное сделано.
Я попытался вызвать AttachInterfaces() вручную, но это тоже не сработало, потому что GetOcx() ничего не возвращает.
Итак, как я могу создать экземпляр моего элемента управления, унаследованного от AxHost, без Windows Forms, чтобы использовать его, например, в консольном приложении?
Решение
К ТВОЕМУ сведению:никто не мешает вам использовать скрытое окно в вашем консольном приложении.
Вы не сможете разместить медиаплеер в приложении, отличном от Windows, - для этого требуется хостинг.Если вы хотите воспроизвести какую-либо музыку, вы можете использовать медиа-графики для создания графика, который отображает (воспроизводит) ваш музыкальный файл - для этого не потребуется никакого дополнительного хостинга.