Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > Динамическая загрузка wmp.dll


Автор: Brain89 14.6.2011, 15:14
Здравствуйте. У меня проект, в котором я использую ActiveX-компонент Windows Media Player (wmp.dll). На более раннем этапе я добавил его на форму, используя Tools -> Choose Toolbox Items... и, соответственно, контрол отобразился на toolbox'е. Перетащил на форму, создалось два файла (AxInterop.WMPLib.dll, Interop.WMPLib.dll), и после я нормально работал с контролом. Но сейчас таскать за собой эти файлы не хочется, тем более, что у каждого пользователя, у которого стоит Windows Media Player, есть wmp.dll. Поэтому хотелось бы грузить эту dll'ку динамически во время запуска приложения и, соответственно, также динамически создавать плеер. Но понятия не имею, как это сделатьsmile Пробовал через Assembly.LoadFile(@"C:\Windows\System32\wmp.dll"), но получаю ошибку, что не найден файл сборки. Вообщем, может кто-то уже проделывал такой трюк? И может мне подсказать? Или хотя бы сказать, в каком направлении рыть. Заранее спасибо.

Автор: jonie 14.6.2011, 15:37
его самому грузить не надо - за это для вас сделаем COM подсистема.
Для того чтобы использовать динамические интерфейсы можно использовать dynamic [http://msdn.microsoft.com/en-us/library/dd264736.aspx]

т.е. вам надо сначала создать экземпляр класса, потом создать экземпляр, потом заюзать dynamic.
Код

Type oType = Type.GetTypeFromProgID (sProgID);
dynamic object = Activator.CreateInstance(oType);
object.SomeIDispatchMethod()...


Если интересна "магия", то начать стоит чтение с IDispatch.
Если вы работает с .NET Fx<4.0, тогда вам надо будет руками это производить  (обращаясь как раз через IDispatch) Пример: http://stackoverflow.com/questions/403218/does-c-net-support-idispatch-late-binding

Автор: Voyager 14.6.2011, 23:09
С приложением достаточно распростарнять AxInterop.WMPLib.dll, Interop.WMPLib.dll. Остальное подхватится само.

Автор: Brain89 15.6.2011, 10:40
2jonie
Что-то про Activator я забыл. Спасибо. Так вполне COM-объект создается:
Код

Object player = Activator.CreateInstance(Type.GetTypeFromProgID("WMPlayer.OCX"));

А через InvokeMember доступ к свойствам я получил:
Код

player.GetType().InvokeMember("URL", BindingFlags.SetProperty, null, player, objArgs);

Вот только как отобразить теперь его на форме? Т.е. проект я запускаю, где-то на фоне звук есть, а вот как отобразить объект как контрол на форме - я не понимаю. У этого плеера нет такого свойства "UserControl", как в примере.

2Voyager
В том-то и задача, чтобы не таскать эти файлы с собой. Ведь создаются они из wmp.dll, которая, в принципе, есть у пользователя. Да и добавить их в инсталлятор не получиться - они защищены Microsoft:)

Автор: jonie 15.6.2011, 12:31
Brain89, вообще говоря в .NET 4 (точнее говоря в VS2010) появилась вохможность указать что тебе надо isolated com  - это в свойствах reference-а -- тогда информацию о типах система включит сама в главную сборку, не делая интеропов.

Автор: Brain89 15.6.2011, 14:33
2jonie
Первый раз о таком слышуsmile А где конкретно можно указать это свойство?

Автор: jonie 15.6.2011, 19:47
user posted image

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)