Вы не обязаны использовать загрузчик сборок на основе отражений для кода .net в настольных гаджетах, вы можете написать сборку, которая будет видимой для коммьюникации, используя идентификаторы классов и т. Д. В этой статье содержится Пример использования .net для достижения того, что вы пытаетесь сделать без «адаптера».
При этом существуют различные проблемы с настольными гаджетами на основе Activex, о которых вам следует знать:
- Когда в гаджете создается экземпляр ActiveX, dll сборки будет "заблокирован открытым" программой sidebar.exe, и файл не может быть удален даже после закрытия гаджета. К сожалению, процесс удаления гаджета не учитывает это, и удаление гаджета приведет к копированию sidebar.exe из файла, если не удается удалить сборку, оставляя сборку и любые другие оставшиеся файлы, которые не были удалено до этого момента. Там также не отображается сообщение об ошибке. То же самое относится и к перезаписи гаджета (например, с новой версией) - sidebar.exe пытается полностью удалить папку перед установкой нового пакета гаджета, что в большинстве случаев приводит к неудачной установке.
- Регистрация такого элемента управления activex может быть очень сложной. Сценарий реестра, указанный в предоставленной вами статье CodeProject, не работает, например, на моей Windows 7 x64. Единственный способ обойти это - использовать WMI для записи в реестр.
- Аналогичным образом, отмена регистрации элемента управления ActiveX также является проблемой. Когда пользователь удаляет гаджет, записи в реестре остаются позади. Полагаю, это не проблема для многих людей, но представьте себе энтузиаста гаджета, который пробует каждый найденный гаджет, внезапно обнаруживая множество неиспользуемых записей реестра. Вы можете обойти это, удалив записи реестра непосредственно после создания экземпляра объекта (так как он все равно кэшируется процессом боковой панели) и повторно зарегистрируя его при следующем запуске.
Поэтому, хотя на самом деле вы можете сделать это без отражения, лучше использовать рефлексию, поскольку вы можете скопировать сборку адаптера в альтернативную папку, использовать ее для загрузки текущей сборки и затем выгрузить ее, когда гаджет закрыт или завершен используй это. Это устраняет первую проблему невозможности удаления гаджета, поскольку сборка размещения находится в другой папке, и отраженная сборка выгружается, когда гаджет все равно закрывается.
Причина, по которой файл facebook.dll не загружается, заключается в том, что используемый вами загрузчик неправильно разрешает зависимости (он не может найти файл, потому что не знает, где искать). Вы можете попробовать наш загрузчик сборок на основе отражений под названием PluginLoader и посмотреть, работает ли он. У нас еще не было официального релиза, но мы собирались сделать его широко доступным и рекомендованным для использования всеми разработчиками, чтобы попытаться устранить проблемы с ActiveX и гаджетами рабочего стола Windows. Поскольку мы официально не выпустили его, вам придется установить наш гаджет Auction Sidebar Tool , который установит загрузчик плагинов, готовый для использования со следующим кодом:
var plLoader = new ActiveXObject("Sidebar.PluginLoader");
var myLibrary = plLoader.LoadAssembly(classToLoad,
System.Gadget.path+"\\path\\to\\MyLibrary.dll");
myLibrary.GetFaceBookFeeds();
Где класс для загрузки - это класс, который вам нужно загрузить в формате Namespace.Class (т.е. MyLibrary.MyClass ). Мы специально закодировали его, чтобы правильно разрешить любые зависимости, поэтому он должен работать для вас просто отлично. Если это работает для вас, вы можете включить его в свой гаджет. Все, что вам нужно, это файлы PluginLoader.js и PluginLoader.dll из папки AuctionSidebarTool, но вам нужно отредактировать файл PluginLoader.js, чтобы удалить детали, которые ссылаются на нашу сборку (строка 110 и далее). Если вы включите это в свой проект, он проверит наличие существующего PluginLoader.dll, а в случае сбоя скопирует его в папку боковой панели Windows в локальных AppData, зарегистрирует его и предоставит объекту AddInLoader
методами LoadAssembly
. и UnloadAssembly
. Если вам нужна дополнительная помощь, просто дайте мне знать в комментариях.
Надеюсь, это поможет. Это, пожалуй, самый длинный ответ, который я когда-либо писал о SO :) 10 *