Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Николаускас
Зарегистрирован: 27.11.2013 Сообщения: 52
|
Добавлено: Вт 24 Дек 2013 13:06 Заголовок сообщения: Сборки |
|
|
Здравствуйте!
У меня вопрос, касающийся работы моего модуля для ИнГео на других компьютерах.
При разработке модуля я по инструкции создавал в ИнГео VB-скрипт, в котором создавался объект моего класса, необходимый для взаимодействия с Application. Упомянутый класс регистрировался в системе с помощью Regasm.exe. Это я понял.
Я не совсем понимаю, как организовать работу модуля на стороннем компьютере. На нем ведь тоже необходимо зарегистрировать свою сборку, чтобы модуль *.inm работал.? Как это сделать, если на стороннем компьютере нет командной строки Visual Studio (студии нет), из-под которой и работают заветные Regasm и Gacutil?
И не могли бы вы объяснить разницу в том, что делают Regasm и Gacutil? |
|
Вернуться к началу |
|
|
Азаматов Азамат Хадисович
Зарегистрирован: 17.02.2005 Сообщения: 100 Откуда: г. Учалы, Респ. Башкортостан
|
Добавлено: Пн 30 Дек 2013 00:15 Заголовок сообщения: |
|
|
regasm регистрирует сборку для COM взаимодействия
gacutil управляет глобальными сборками. вполне можно обходиться и без нее, тем более что для COM регистрация через regasm все равно будет глобальной.
в принципе регистрация сборки достаточно проста, я просто сделал программу регистратор и поставляю с модулями сделанными под .NET
в installer.dat нужно просто вписать название сборки.
http://yadi.sk/d/0TZdBJFoFB4ss
а еще можно создать стандартный проект установки в Visual Studio, установщик будет все сам регистрировать. |
|
Вернуться к началу |
|
|
APopov
Зарегистрирован: 19.06.2006 Сообщения: 347 Откуда: Самара
|
Добавлено: Вт 21 Янв 2014 17:43 Заголовок сообщения: |
|
|
Мы устанавливаем модули с помощью innoSetup, в котором на завершающем шаге установки делаем как-то так:
Код: |
procedure RegDotnetCom(const fn:string; withCodebase:boolean);
var ResultCode :Integer;
good :boolean;
regPars :string;
begin
regPars := '"'+ExpandConstant(fn)+'"';
if withCodebase then
regPars := regPars +' /codebase';
log('script exec: '+ExpandConstant('{dotnet40}\regasm.exe')+' '+regPars);
good := Exec(ExpandConstant('{dotnet40}\regasm.exe'), regPars,
'', SW_SHOW, ewWaitUntilTerminated, ResultCode);
log('result: '+IntToStr(Integer(good))+' rescode: '+IntToStr(ResultCode));
end;
procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep=ssPostInstall then begin
RegDotnetCom('{app}\Interop.GeoTransformer.dll', true);
RegDotnetCom('{app}\Interop.Ingeo.dll', true);
RegDotnetCom('{app}\Interop.InScripting.dll', true);
RegDotnetCom('{app}\XmlMPImport.dll', true);
end;
end; |
_________________ ОАО "Самара-Информспутник",
инженер-программист Попов Артем |
|
Вернуться к началу |
|
|
Николаускас
Зарегистрирован: 27.11.2013 Сообщения: 52
|
Добавлено: Вт 21 Янв 2014 17:51 Заголовок сообщения: |
|
|
Большое спасибо всем ответившим!
APopov, можете сказать, для чего вообще нужна "InScripting.dll"? |
|
Вернуться к началу |
|
|
APopov
Зарегистрирован: 19.06.2006 Сообщения: 347 Откуда: Самара
|
Добавлено: Вт 21 Янв 2014 18:44 Заголовок сообщения: |
|
|
в Ingeo.exe "содержатся" две tlb - ingeo.tlb и InScripting.tlb. первая - основная, содержит определение почти всех интерфейсов, вторая вспомогательная, содержит, в основном, интерфейсы используемые из скриптов (наверное так задумывалось, судя по названию) и так же интерфейсы для работы с символьными методами отображения.
В общем, обе тесно взаимосвязаны, почему они идут не "в одном флаконе" я не знаю. _________________ ОАО "Самара-Информспутник",
инженер-программист Попов Артем |
|
Вернуться к началу |
|
|
Азаматов Азамат Хадисович
Зарегистрирован: 17.02.2005 Сообщения: 100 Откуда: г. Учалы, Респ. Башкортостан
|
Добавлено: Чт 23 Янв 2014 17:38 Заголовок сообщения: |
|
|
APopov писал(а): | Мы устанавливаем модули с помощью innoSetup, в котором на завершающем шаге установки делаем как-то так:
Код: |
...
RegDotnetCom('{app}\Interop.GeoTransformer.dll', true);
RegDotnetCom('{app}\Interop.Ingeo.dll', true);
RegDotnetCom('{app}\Interop.InScripting.dll', true);
...
|
|
насколь я понимаю документацию, если интероповские сборки находятся в одной папке с основной сборкой, то регить их не нужно. |
|
Вернуться к началу |
|
|
APopov
Зарегистрирован: 19.06.2006 Сообщения: 347 Откуда: Самара
|
Добавлено: Чт 23 Янв 2014 17:48 Заголовок сообщения: |
|
|
да. мы до этого недавно дошли
это кусок старого инсталлера. теперь регаем только сборки содержащие COM-объекты. _________________ ОАО "Самара-Информспутник",
инженер-программист Попов Артем |
|
Вернуться к началу |
|
|
Николаускас
Зарегистрирован: 27.11.2013 Сообщения: 52
|
Добавлено: Вт 28 Янв 2014 17:31 Заголовок сообщения: |
|
|
Здравствуйте! Снова я.
Закончил с инсталлятором. Решил последовать совету RegAsm.exe и подписать сборку. Теперь подписанная сборка regasm'ом вообще не хочет регистрироваться. "Невозможно загрузить файл или сборку ... или один из зависимых от них компонентов. Найденное определение манифеста сборки не соответствует ссылке на сборку. <Исключение из HRESULT: 0x80131040>".
При этом с неподписанной сборкой проблем нет. При последующем удалении программы происходит "разрегистрация" неподписанной сборки по методу APopov'a (интересно звучит) и, например, в реестре я не нахожу и следа от ее CLSID.
Знает ли кто-нибудь причины такого поведения?
Подписываю сборку в свойствах проекта в Visual Studio. |
|
Вернуться к началу |
|
|
kolyanch
Зарегистрирован: 28.01.2014 Сообщения: 3 Откуда: Самара
|
Добавлено: Вт 28 Янв 2014 21:15 Заголовок сообщения: |
|
|
Регистрируете с параметром /codebase?
Все зависимые .net сборки подписаны? |
|
Вернуться к началу |
|
|
Николаускас
Зарегистрирован: 27.11.2013 Сообщения: 52
|
Добавлено: Ср 29 Янв 2014 10:49 Заголовок сообщения: |
|
|
Да, с /codebase.
Зависимых сборок-то больше вроде и нет. Она сама зависима от Interop.Ingeo.dll. |
|
Вернуться к началу |
|
|
kolyanch
Зарегистрирован: 28.01.2014 Сообщения: 3 Откуда: Самара
|
Добавлено: Ср 29 Янв 2014 12:24 Заголовок сообщения: |
|
|
Может быть несколько причин:
1. Не установлено ИнГео на машине, на которую Вы деплоите
2. В инсталлятор всё таки попали сборки с неактуальной подписью
Попробуйте сделать полный ребилд солюшена и пересобрать инсталлятор.
Ещё уточню исключение возникает для вашей сборки или "Невозможно загрузить файл или сборку..." выводится для Interop-а? |
|
Вернуться к началу |
|
|
Николаускас
Зарегистрирован: 27.11.2013 Сообщения: 52
|
Добавлено: Ср 29 Янв 2014 12:31 Заголовок сообщения: |
|
|
ИнГео установлено.
Благодаря Вашему вопросу, я заметил, что исключение возникает для Interop.Ingeo, а не для моей сборки. Все моя невнимательность. Но тогда я вообще не понимаю, чего regasm'у надо
Хочу заметить, что данная проблема возникает точно не из-за инсталлятора, поскольку при обычной регистрации сборки с ручным вводом команды выходит то же самое. |
|
Вернуться к началу |
|
|
kolyanch
Зарегистрирован: 28.01.2014 Сообщения: 3 Откуда: Самара
|
Добавлено: Ср 29 Янв 2014 13:13 Заголовок сообщения: |
|
|
Я бы всё-таки посоветовал целиком очистить и пересобрать солюшен.
В свойствах interop-ов выставить
Embed Interop Types в false
Copy Local в true |
|
Вернуться к началу |
|
|
Николаускас
Зарегистрирован: 27.11.2013 Сообщения: 52
|
Добавлено: Ср 29 Янв 2014 14:51 Заголовок сообщения: |
|
|
Причина нашлась. Я проводил опыты с регистрацией сборок в каталоге, в котором лежали Interop.Ingeo.dll и Interop.InScripting.dll, взятые из папки Release проекта еще до проведения подписывания сборки. Неподписанная сборка с ними регистрировалась, а подписанная нет. То есть получается, что подписанной сборке требуются Interop.Ingeo.dll и Interop.InScripting.dll, взятые непосредственно после ее подписывания и сборки проекта.
Никогда бы не подумал, что уже готовые библиотеки каким-то образом могут различаться в зависимости от ситуации. Наверно я не до конца понимаю процесс подписывания сборок.
Спасибо за участие и советы. |
|
Вернуться к началу |
|
|
Николаускас
Зарегистрирован: 27.11.2013 Сообщения: 52
|
Добавлено: Чт 30 Янв 2014 17:54 Заголовок сообщения: |
|
|
Здравствуйте!
Возник вопрос относительно работы метода FindStyleView(string id).
Оказалось, что при работе в клиенте ИнГео версии 4.4 он отрабатывает нормально, а при вызове его в модуле в клиенте версии 4.3 возникает ошибка с сообщением следующего содержания:
"Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена".
Кто-нибудь знает, в чем причина? В ИнГео 4.3 этот метод не поддерживается?
Здесь http://www.integro.ru/dl/ingeo/ingeo4History.htm ничего на этот счет не нашел.
Код, вызывающий исключение:
IIngeoStyleView styleView = app.ActiveProjectView.FindStyleView(styleItem.Id);
где styleItem.Id - существующий текстовый id существующего стиля. |
|
Вернуться к началу |
|
|
APopov
Зарегистрирован: 19.06.2006 Сообщения: 347 Откуда: Самара
|
Добавлено: Чт 30 Янв 2014 18:51 Заголовок сообщения: |
|
|
в ингео 4.3 этого метода не было вообще, там и стили в основном окне ингео не показывались и им видимость невозможно было отключить.
Получается, вы используете таблицы вызовов процедур из 4.4, а в 4.3 адрес этой функции ведёт чёрте куда... _________________ ОАО "Самара-Информспутник",
инженер-программист Попов Артем |
|
Вернуться к началу |
|
|
APopov
Зарегистрирован: 19.06.2006 Сообщения: 347 Откуда: Самара
|
Добавлено: Чт 30 Янв 2014 18:52 Заголовок сообщения: |
|
|
и да. снова осмелюсь напомнить: новая несвязанная проблема - новый топик.
это простое правило облегчает поиск тем и ответов на вопросы для будущих поколений. _________________ ОАО "Самара-Информспутник",
инженер-программист Попов Артем |
|
Вернуться к началу |
|
|
Николаускас
Зарегистрирован: 27.11.2013 Сообщения: 52
|
Добавлено: Пт 31 Янв 2014 10:40 Заголовок сообщения: |
|
|
Спасибо.
Согласен. |
|
Вернуться к началу |
|
|
|