Pull to refresh

Comments 11

«Т.к. в плагине нельзя запустить пошаговую отладку в VS...»

Не знаю как с автокадом, но вроде бы студийный отладчик не плохо умеет подключаться к произвольному приложению и отлаживать загруженные managed сборки. Вы пробовали подключить к автокаду сборку собранную в конфигурации DEBUG и подцепиться к автокаду отладчиком (VS Menu->Debug->Attach to process...)?
Да, пробовал.
На том месте, где должна появляться пошаговая отладка появляется сообщение о том, что «No symbols are loaded for any call stack frame.» и предложением показать дизассемблированный код, который тоже не показывается, потому что «No disassembly available.»

Pdb файл лежит рядом с DLL в папке C:\PluginName\
Попробуйте загрузить *.pdb вручную после attach'a к процессу AutoCAD'a:
Debug -> Windows -> Modules
Правой кнопкой мыши на нужном модуле (скорее всего это будет AutoCAD) и Load Symbols from…
Странно… в Modules видно, что символы для моего плагина загружаются автоматически.

Name: AutocadGeocomplexPlugin.dll
Path: C:\GeoComplexAutocadPlugin\AutocadGeocomplexPlugin.dll
Optimized: No
UserCode: Yes
Symbols loaded.
Symbol path: C:\GeoComplexAutocadPlugin\AutocadGeocomplexPlugin.pdb
Process: [3100] acad.exe: Managed (v2.0.50727)
Да дело похоже в автокаде. Погуглив по «No symbols a...» и «autocad plugin» можно найти даже советы по решению проблемы, которые в некоторых случаях могут помочь. К сожалению нет автокада под рукой, а так самому интересно.
Победил эту проблему таким образом:
В файле настройки автокада acad.exe.config установил среду исполнения на v4.0:
 <configuration>
	<startup useLegacyV2RuntimeActivationPolicy="true">
		<supportedRuntime version="v4.0"/>
	</startup>
	<runtime>
		<generatePublisherEvidence enabled="false"/>
	</runtime>
</configuration>


Поменял среду исполнения плагина на 4.0 client profile
И настройках сборки AssemblyInfo.cs закомментировал атрибут AllowPartiallyTrustedCallers

Пока работает…
Уточню:
— для Visual Studio есть специальные шаблоны проектов, ищем autocad_2013_dotnet_wizards
— плагин помечать обозначать атрибутом ExtensionApplication и наследовать от IExtensionApplication
— не раскрыты параметры атрибута CommandMethod
— подключаемые сборки нужно помечать Copy Local: False, для AutoCAD 2013 добавилась сборка accoremgd.dll
— по поводу ObjectId и Handle не совсем точно, ObjectId можно сохранять внутри чертежа (в XData и ExtensionDictionary), тогда между сессиями он сохраняет свое значение. Handle нужен чтобы сохранять его вне чертежа, на практике это нужно очень редко и создает только больше проблем.
— пример GetPolylineByEname очень плохой, объект нельзя передавать из транзакции, если у вас так работает то вам очень повезло. Все операции с объектом должны проходить внутри транзакции и завершаться transaction.Commit(), если вы его не вызываете явно то при использовании using будет вызван transaction.Abort(), но он медленнее чем Commit, поэтому Commit всегда предпочтительней.
— данные из XRecord нужно читать по коду DxfCode.ExtendedDataAsciiString, а не по порядку, порядок может меняться.
— запустить пошаговую отладку в VS можно, так же как и загружать плагин без правок реестра.
Debug -> Start External Program -> путь к acad.exe
Debug -> Command Line Arguments -> /b путь к start.scr (внутри которого запись netload «путь к сборке» пробел)
обязательно Cope Local: False
но может не завестись на разных версиях VS и ACAD
В 2012 версии можно подгружать плагин положив его в специальную папку и прописав специальный манифест, в 2013 версии можно обращаться к объекту без транзакций через dynamic (на самом деле через транзакции :)
В общем на 3+ вышло :)
«плагин помечать обозначать атрибутом ExtensionApplication и наследовать от IExtensionApplication»
Как я понял, это нужно делать, только если нужно контролировать Initialize()/Terminate() плагина?
Пробовал удалить эту часть, все работает так же

" объект нельзя передавать из транзакции"
А если я получаю его в режиме только чтение? Мне кажется для него только заполняются поля и далее этот объект никак не связан с базой и транзакцией, так?

«но он медленнее чем Commit, поэтому Commit всегда предпочтительней.»
«подключаемые сборки нужно помечать Copy Local: False»
спасибо, буду знать

«по поводу ObjectId и Handle не совсем точно...»
То есть, если я записываю, к примеру, вырезы полилинии в ее ExtDictionary в виде строковых значений разделенных пробелом ObjectId: «3256445 57894554 3215456», я могу быть уверен, что при следующих запусках эти значения будут идентифицировать тот же объект?

«Запустить пошаговую отладку в VS можно...»
Не получается, установил брякпоинт, запустил через F5, дохожу до вызова своей функции и… "Неизвестная команда «PL_NORM». Для вызова справки нажмите F1."

— Это нужно делать чтобы плагин загружался быстрее, AutoCAD ищет помеченные классы и загружает их в первую очередь.
— Вызов некоторых свойств и методов на объекте может приводить к повторному чтению, какие из них точно приводят к этому не берусь сказать, это может привести к непонятным ошибком которые обычно заканчиваются закрытием AutoCAD.
— Нет, для хранения ObjectId есть специальное значение DxfCode, в Xrecord под одним кодом можно записывать несколько значений, преобразовывать в строку не нужно. Тогда будет работать.
— Версия AutoCAD и VS, под какой фреймворк компилируете? Лучше смотреть настройки проекта целиком, выложите где-нибудь проект — посмотрю.
Вызов некоторых свойств и методов на объекте может приводить к повторному чтению
Пока что не доводилось их вызывать, видел несколько методов, которые дублированы свойствами и помечены как устаревшие с сообщением (use transaction instead).
А как тогда поступить, если во многих местах нужно просто получить некоторую информацию из объекта, каждый раз писать код транзакции?

Версия AutoCAD и VS, под какой фреймворк компилируете? Лучше смотреть настройки проекта целиком, выложите где-нибудь проект — посмотрю.
Autocad 2007, при установке поставил .NET 2.0.
Пишу в .NET 3.5 из-за плюшек LINQ. В конце при необходимости собирался переписать обратно на 2.0, т.к. слышал о проблемах скорости и использования памяти LINQ. Проект сейчас скину в ЛС

для хранения ObjectId есть специальное значение DxfCode
Не помните какое именно? image
Смысл опубликовывать вершки, которых нахватался за получасовое чтение мануала? В чём изюм поста? В интернете полно ресурсов, в которых вопросы .NET программирования под AutoCAD изложены более грамотно. Имхо. Ссылка по теме. По содержимому статьи полно замечаний… Если их выписывать — получится новая статья, об ошибках этой…
Sign up to leave a comment.

Articles