Перекомпиляция приложения .net под автокад 2012 и выше

Автор Тема: Перекомпиляция приложения .net под автокад 2012 и выше  (Прочитано 12300 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Volody1983Автор темы

  • ADN OPEN
  • **
  • Сообщений: 52
  • Карма: 0
Добрый день!
В свое время писал приложение, работающее под Acad MEP 2009 - 2011. Acad MEP в смысле того, что приложение активно использовало его API. Возникла потребность перекомпилировать под более свежую версию, выше 2011. Но так как навыки (с 2011) были утеряны, столкнулся с сложностями. Может кто подскажет с чего начать?

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Но так как навыки (с 2011) были утеряны, столкнулся с сложностями. Может кто подскажет с чего начать?
С обозначения сложностей.

Оффлайн Volody1983Автор темы

  • ADN OPEN
  • **
  • Сообщений: 52
  • Карма: 0
Андрей самые начальные вопросы (я около пяти лет был далек от программирования):
1. Проект писался в 2008 студии. Есть смысл ставить что-то новее для 2015 автокада? Раньше по-моему версия студии для net приложение была не важна. По крайней мере для 2009-2010(11) я компилировал в 2008 студии.
2. А самое нужное это помощь в ссылке для понимания того, что автодеск в 2012 версии что-то изменил в ядре, а апи для платформы начиная с 2012 версии растащено на более чем две DLL.
Андрей прошу отнестись с пониманием, т.к. знаю что у Вас такие вопросы могут вызвать эмоции.

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
а апи для платформы начиная с 2012 версии растащено на более чем две DLL.
не с 2012, а с 2013. В виду этого существует вероятность того, что твой код, скомпилированный под 2011-й будет работать и в 2012-м акаде. Основная масса моих программ скомпилирована под 2009 и успешно работает вплоть до 2012-го акада. Перекомпиляция требуется для 2013-го акада. Нужно в референсы добавить ссылку на accoremgd.dll. Не исключено, что результат будет работать не только в 2013-м но и в более новых.

Оффлайн Volody1983Автор темы

  • ADN OPEN
  • **
  • Сообщений: 52
  • Карма: 0
Андрей, а студию имеет смысл более новую ставить?

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Андрей, а студию имеет смысл более новую ставить?
Если используемая тобой IDE поддерживает работу с нужной тебе версией .NET Framework, то можно обойтись и без более новой.

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78

Оффлайн Volody1983Автор темы

  • ADN OPEN
  • **
  • Сообщений: 52
  • Карма: 0
Андрей действительно в 2012 ACAD MEP мое приложение работает, но компилировал его я в 2008 студии (NET 3.5 sp1). Что противоречить информации с ссылке выше, а именно "[R18.2] AutoCAD 2012: .NET 4.0, 4.5, 4.5.1 (см. примечание 2); Visual Studio 2010 и более новые." Может это опечатка?

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Что противоречить информации с ссылке выше
Не противоречит. По ссылке указаны системные требования для компиляции под указанные версии акада. Возможность компиляции и возможность загрузки уже скомпилированного (под более ранние версии акада) - это не одно и то же. Например, в акад 2012 может быть загружен плагин, скомпилированный под 2009-й акад.  Но для того, чтобы скомпилировать код под акад 2012, необходимо чтобы выполнялись условия для 2012-го акада, обозначенные по ссылке.

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Например, здесь один и тот же код скомпилирован дважды: для 2009-го акада и для 2013-го. В результате получены две библиотеки: `pvp.R17.2.dll` и `pvp.R19.0.dll`. Первая из них грузится в акады 2009-2012, а второй - во все более новые версии акада. Т.о. нет смысла компилировать код под все существующие версии акада - нередко достаточно двух (если не планируется использовать специфическую для более новой версии акада функциональность).

Оффлайн Volody1983Автор темы

  • ADN OPEN
  • **
  • Сообщений: 52
  • Карма: 0
Андрей большое спасибо за инфу, буду пробовать перекомпилировать.

Оффлайн Volody1983Автор темы

  • ADN OPEN
  • **
  • Сообщений: 52
  • Карма: 0
В продолжению к разговору. Пробую компилировать приложение под акад 2013. Среду поставил .net 4. Обновил ссылки на acmgd, acdbmgd, добавил accoremgd, обновил ссылки на API MEP(ACA). Но теперь все конструкции типа:
Using userInteraction As EditorUserInteraction = ed.StartUserInteraction(Me)
End Using
Выдают ошибку:
"Ошибка   10   Не удалось разрешить перегрузку, так как ни один доступный "StartUserInteraction" не может быть вызван с данными аргументами:
    'Public Function StartUserInteraction(window As System.Windows.Window) As Autodesk.AutoCAD.EditorInput.EditorUserInteraction': Невозможно преобразовать значение типа "Sb.Plugin.CableLeaderUtilForm" в "System.Windows.Window".
    'Public Function StartUserInteraction(hwnd As System.IntPtr) As Autodesk.AutoCAD.EditorInput.EditorUserInteraction': Невозможно преобразовать значение типа "Sb.Plugin.CableLeaderUtilForm" в "System.IntPtr".
"
Вспоминаю, что конструкция была необходима для выбора мышкой из модального окна. Может кто подскажет, что поменялось в версии 2013 и выше?

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Вначале проверь именные пространства (то ли ты вызываешь), затем не изменились-ли перегрузки метода - такое в "автокадах" бывает.

Оффлайн Volody1983Автор темы

  • ADN OPEN
  • **
  • Сообщений: 52
  • Карма: 0
Все оказалось проще. Достаточно поправить Me на Me.Handle

Оффлайн Volody1983Автор темы

  • ADN OPEN
  • **
  • Сообщений: 52
  • Карма: 0
Еще одна ошибка осталась в функции сохранения через COM:
    Friend Shared Sub SaveDocument(ByVal Doc As Document)
             Dim oAcadDoc As Object = Doc.AcadDocument
        oAcadDoc.[GetType]().InvokeMember("Save", Reflection.BindingFlags.InvokeMethod, Nothing, oAcadDoc, Nothing)
    End Sub
В 2013 не работает. Непонятно пока, что они нахимичили и чем заменить.