Ошибка при вызове .net DLL из библиотеки Com Visible с использованием JavaScript - PullRequest
2 голосов
/ 04 января 2010

Я занимаюсь разработкой гаджета для Windows 7. Я создаю объект activex и загружаю сборку. Я следую методологии, упомянутой здесь в codeproject (GadgetInterop). Одной из задач гаджета является взаимодействие с Facebook.

Вот как я ссылаюсь: Javascript создает объект GadgetBuilder. Отсюда я загружаю свою библиотеку. сказать "MyLibrary.dll".

  • Когда я вызываю метод, скажем, MyLibrary.GetCount (), (просто возвращает некоторое целое число), он работает.
  • Но когда я вызываю некоторую функцию facebook внутри метода, скажем, MyLibrary.GetFaceBookFeeds (), он выдает ошибку. Я ссылаюсь на «facebook.dll» из CodePlex

Если я тестирую свой код из формы ASP.NET, он работает отлично. Однако, когда я запускаю его со своей html-страницы, пытаясь загрузить его с помощью javascript, я получаю следующую ошибку:

Не удалось загрузить файл или сборку 'facebook, версия = 2.1.3654.38113, Culture = нейтральный, PublicKeyToken = null' или одна из его зависимостей. Система не может найти указанный файл.

Я проверил, что DLL находятся в той же папке, что и "MyLibrary.dll".

  1. Почему появляется эта ошибка?
  2. Как мне добиться своей цели? (Мне нужно использовать вызов dll из javascript, поскольку мы делаем много других вещей в dll).

1 Ответ

1 голос
/ 05 января 2010

Вы не обязаны использовать загрузчик сборок на основе отражений для кода .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 *

...