powered by simpleCommunicator - 2.0.57     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / addin на sharpdevelop
10 сообщений из 10, страница 1 из 1
addin на sharpdevelop
    #38126958
BaurzhanS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет!

Формулировка вопроса проста - как написать addin для MS WORD с помощью SharpDevelop?
Я посмотрел как это делается в VisualStudio-

1) подключается GAC reference - библиотека для работы с офисными объектами
2) создается скелет класса с двумя методами - действия при загрузке/выключении офисной программы.
3) созданный addin регистрируется в реестре, причем в реестр прописывается манифест - .vsto файл, который, насколько я понял, дает знать запущенному word-у, откуда загружать дополнения.

А как я пытался сделать это с помощью SharpDevelop

1) Погуглив, выяснил, что надо создать пустой addin-project.
2) Подключил офисные библиотеки в папку references созданного проекта.

А вот дальше есть вопросы - какие мне необходимо расширять интерфейсы, классы для написания аддина, куда писать свой код? В студийном проекте не разобрался, откуда он берет эти два метода, о которых я говорил выше. Я ожидал что мне необходимо реализовать некий интерфейс, переопределив методы вроде doSmthOnStartUp(), doSmthOnWordSelection(),doSmthOnButtonPress() и.т.д. или там как-то по-другому?

Второй вопрос о регистрации в реестре - sharp develop создает некий .addin файл, который, как я понял, выполняет те же функции, что и .vsto в студийном проекте. На форумах люди советуют добавить в этот .addin файл manifest section - туда только название .dll пишем. Вопрос - Если я вручную добавляю в реестр инфу о своей .dll - должен ли я прописать именно этот .addin файл или как-то по другому? Причем в студийном файле куча информации, как-то жирный xml файл, по сути, а .addin, даже с добавлением секции манифест - всего несколько строчек, что вызывает подозрения, что я что-то не так понял.

Обобщая вышенаписанное, прошу помощи по 2 вопросам - куда писать код (сэмплы, ссылки приветсвуются), как регистрировать в системе свой аддин. Студию не предлагать, надо решить вопрос именно на SharpDevelop, и библиотеку NetOffice не предлагать - там какая-то жирная библиотека, я не вникал тщательно, но это вроде как из пушки по воробьям. Должен же быть простой способ подрубить офисные .dll-ки, написать свой код, зарегать все это в реестре и все. Если кто делал подобное, поделитесь опытом, пожалуйста.
...
Рейтинг: 0 / 0
addin на sharpdevelop
    #38131386
BaurzhanS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неужели никто не сталкивался с подобной проблемой?
...
Рейтинг: 0 / 0
addin на sharpdevelop
    #38135431
BaurzhanS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Теперь вопрос видоизменился.

Как вывод из того, что я урывками читал в интернете - можно создать addin с помощью специального инструментария, предоставляемого студией VS tools for office - VSTO, а можно создать СОМ addin - для этого подключить Extensibility и реализовать интерфейс IDTExtensibility2 - там методы, в которых необходимо описать поведение addin-а при загрузке,выгрузке и т.д.

Вопрос - как все таки зарегистрировать addin в системе? В реестре, в разделе current user/software/microsoft/office/word/addins создал свой подраздел, как было сказано во многих источниках, там создал переменные - имя надстройки, load behavior - не разобрался, куда прописывать путь к самой dll? А еще, SharpDevelop создает .addin файл - xml-дескриптор, его вроде тоже необходимо регистрировать - куда?

Ну и менне насущный на данном этапе вопрос - предположим, я зарегал в системе примитивный addin, выводящий messageBox при загрузке. Но мне еще надо описать действия при других событиях - выделение слова, нажатие какой-либо клавиши и.т.д - это еще какой-то интерфейс надо реализовать?

Блин, кто-нибудь дайте пожалуйста внятные инструкции, в нете вроде много материала, все вокруг да около кручусь, обидно, что алгоритмическую часть знаю как сделать, а застрял на чисто технических мелочах. Даже messageBox("hello world"); не получается сделать:(
...
Рейтинг: 0 / 0
addin на sharpdevelop
    #38136709
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BaurzhanSВ реестре, в разделе current user/software/microsoft/office/word/addins создал свой подраздел, как было сказано во многих источниках, там создал переменные - имя надстройки, load behavior - не разобрался, куда прописывать путь к самой dll?Путь к dll прописывать не нужно, ее нужно только зарегистрировать.
Имя раздела должно называться ИмяDLL.ИмяКласса — это ProgID класса, реализующего IDTExtensibility2. По этому ProgID ворд в HKCR находит одноименный раздел, в этом разделе указан CLSID этого класса, в CLSID прописан путь к файлу. Это основа функционирования COM, азбука можно сказать.

load behavior - не разобралсяВнутри раздела ИмяБиблиотеки.ИмяКласс нужно создать значение LoadBehavior типа reg_dword и присвоить нужное значение.

А еще, SharpDevelop создает .addin файл - xml-дескриптор, его вроде тоже необходимо регистрировать - куда?Он не нужен.

Но мне еще надо описать действия при других событиях - выделение слова, нажатие какой-либо клавиши и.т.д - это еще какой-то интерфейс надо реализовать?Никакой. Нужно получать ссылки на все документы и само приложение и обрабатывать их события.
...
Рейтинг: 0 / 0
addin на sharpdevelop
    #38145082
BaurzhanS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,спасибо за ответ, я думал уже никто не ответит.

Я пробовал, сделать все, что Вы мне написали, но что-то не пошло(
Я выполнил 3 действия в реестре:

1) в разделе HKCU/software/microsoft/office/word/addins создал подраздел ИмяDLL.ИмяКласса. в этом разделе создал переменные LoadBehavior,Description,FriendlyName. В LoadBehavior установил значение 3.

2) в разделе HKCR создал подраздел ИмяDLL.ИмяКласса/CLSID , и там переменной по умолчанию установил значение {649D6562-F01F-4117-BF2C-198CDD3E11E4}, именно со скобочками, как показано было в примерах. Значение взял из примера, его не нашел как генерить, но я так понял, я его сам назначаю, на всякий случай не стал придумывать (вдруг формат не угадаю), а взял из примера.

3) после 2-го действия в разделе HKCR/CLSID/{649D6562-F01F-4117-BF2C-198CDD3E11E4}/Inprocserver32 в переменной по умолчанию установил путь до .dll

После этого я перезагрузил компьютер и после перезагрузки обнаружил, что "испортил" свой Word - он писал, что произошла серьезная ошибка и попросился запуститься в безопасном режиме. В безопасном режиме, посмотрев в параметрах Word надстройки, увидел свою надстройку в списке неактивных. Надстройка не запустилась - я просто выводил MessageBox во всех событиях интерфейса IDTExtensibility2 и никакого мс-бокса не увидел.

Вопросы:
1) что я делал не так, что умудрился испортить word?
2) guid - это любое 128 битное число, разделенное знаком тире таким образом: 4 байта-2 байта-2 байта-2 байта - 6 байт?
...
Рейтинг: 0 / 0
addin на sharpdevelop
    #38145387
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 и 3 вручную делать не надо, нужно выполнить regsvr32 path/your.dll. Лучше очистите HKCR от своих экспериментов.
Учитывая, что это хоть и com-visible dll, но все же .net, возможно regsvr32 не сработает, тогда нужно попробовать regasm. Путь к нему в переменных окружения не прописан, его нужно искать в %systemroot%\Microsoft.NET.
...
Рейтинг: 0 / 0
addin на sharpdevelop
    #38148531
BaurzhanS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy, спасибо. Получилось таки вывести "Hello world") Для тех, кому это потом может понадобиться, при проблемах с регистрацией .dll выолняем следующие действия:

1) В файле AssemblyInfo устанавливаем [assembly: ComVisible(true)]
2) Выбираем тот RegAsm той версии .NET, на которой вы собрали свой .dll - например, я регистрировал свою через RegAsm, лежащий в %systemroot%/microsoft.net/framework/4.0/regasm.exe.
3) Желательно, чтобы путь к .dll содержал только английские буквы, я вообще положил его в корень D диска. Еще в интернете рекомендовали менять некий regasm.config - пишу на память, в общем, xml-файл, лежащий в одной директории с RegAsm.exe, в этом файле надо дописать <runtime> <loadFromRemoteSources="true"/> </runtime> , но мне это не понадобилось, у меня были проблемы из-за русских букв в пути файла.
4) хоть я и сидел под админом, выполнение регистрации через командную строку Far требовало запуска от имени админа. Для удобства я создал батник и запустил его от имени администратора - может кому пригодится.

P.S. - На самом деле, при установке на клиентскую машину могут возникать всякие "спецэффекты", типа не подходящих к текущей версии офиса IntertopAssemblies, отсутсвие необходимой версии .NET framework, отсутствие админских прав у пользователя, устанавливающего надстройку. Я в этом пока особо не разбирался, но кажется, чтобы подружить Вашу надстройку с конкретной версией офисной программы, с конкретными параметрами системы , придется потратить немало усилий)

P.P.S - В ранних ответах Antonariy писал мне, чтобы обрабатывать события офисного прилодения "Нужно получать ссылки на все документы и само приложение и обрабатывать их события". - можно небольшой примерчик? Ссылку на приложение перехватываем в констукторе, а как реагировать на его события? Я представляю как-то так:

addinLoad(){
app = getAppRef();
app.requiredEvent+=myEventHandler(); //и ниже метод myEventHandler
}
Правильно в общих чертах?
...
Рейтинг: 0 / 0
addin на sharpdevelop
    #38148565
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Нужно получать ссылки на все документы и само приложение и обрабатывать их события". - можно небольшой примерчик?Можно конечно.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
    Private _applicationObject As Word.Application
    Private _addInInstance As AddIn

    Public Sub OnConnection(ByVal application As Object, ByVal connectMode As ext_ConnectMode, _
        ByVal addInInst As Object, ByRef custom As Array) Implements IDTExtensibility2.OnConnection

        'В этом месте приходит ссылка на экземпляр приложения, хостящего аддин, это будет ворд. 
        'Коллекция его документов будет в _applicationObject.Documents, что с ней делать дальше, можно узнать из справки по ворду
        'Само собой, ворд должен присутствовать в референсах аддина 

        _applicationObject = CType(application, Word.Application)
        _addInInstance = CType(addInInst, AddIn)
    End Sub
...
Рейтинг: 0 / 0
addin на sharpdevelop
    #38148815
BaurzhanS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy, большое спасибо! Будем пробовать.
...
Рейтинг: 0 / 0
addin на sharpdevelop
    #38163885
BaurzhanS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос лишь косвенно касается сабжа, но не стал заводить новую тему.

Вопрос об объекте Microsoft.Intertop.Selection: как у него посмотреть текст? В примерах пишут про свойство Text, у меня его нет. У меня Word 2007. У selection есть свойства words,rows - их пытался распечатать, и также что-то вроде rows[0].toString() - ничего не выводит, такое чувство, что где-то внутри происходит runtime error, но мне не показывается. В документации есть у 10-го и 3-его word-а, может быть, с этим связано, но как тогда забрать текст у selection в 7-ом word-e? Ну и еще маленький вопрос - есть ли способ отлавливать нажатие клавиш, более компактный и элегантный чем этот ? Вообще говоря, это мне надо для отлавливания последнего введенного слова, может быть, необязательно слушать клавиши? Например, в голову приходит такой вариант -
1) делаем selection.wholeStory() - типа делаем CTRL+A
2) у выделенного selection можно запустить find.execute("пробел")
3) от последнего пробела до текущей позиции - это и есть последнее введенное слово.

Но это слишком тупо и я не умею после Find.execute - забирать те позиции, которые он нашел. Какие есть мысли, идеи, предложения? Буду очент признатален за любую помощь, по сути, умение делать getText() у Selection( перехватывать его я умею) и умение перехватывать последнее введенное слово - это все мне нужно)
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / addin на sharpdevelop
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]