Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Пашин Евгений от 10-11-2015, 11:50:21

Название: При запуске модуля выдает «nil»?
Отправлено: Пашин Евгений от 10-11-2015, 11:50:21
Добрый день, ищу ответ на вопрос:
Что может быть причиной появления сообщения «nil» при запуске модуля? Модуль работает почти на всех машинах, кроме некоторых (в основном Windows 7)! У кого-нибудь происходило что-то подобное?
Название: Re: При запуске модуля выдает «nil»?
Отправлено: Александр Ривилис от 10-11-2015, 11:52:03
Что может быть причиной появления сообщения «nil» при запуске модуля?
Будем гадать на кофейной гуще? nil обычно возвращают lisp-программы.
Название: Re: При запуске модуля выдает «nil»?
Отправлено: Александр Пекшев aka Modis от 10-11-2015, 11:52:57
Александр меня опередил - только хотел сказать, что в C# нет nil
Название: Re: При запуске модуля выдает «nil»?
Отправлено: Пашин Евгений от 10-11-2015, 11:54:57
Будем гадать на кофейной гуще? nil обычно возвращают lisp-программы.

Да, LISP присутствует, но только для того, чтобы определить разрядность системы...

Сейчас более подробно ошибочку обозначу.
Название: Re: При запуске модуля выдает «nil»?
Отправлено: Александр Пекшев aka Modis от 10-11-2015, 11:56:01
LISP присутствует, но только для того, чтобы определить разрядность системы...
Ого! Какие извращения )))

Добавлено: хотя может и смысл есть - средствами .Net оказывается нельзя узнать разрядность системы
Название: Re: При запуске модуля выдает «nil»?
Отправлено: Пашин Евгений от 10-11-2015, 11:56:54
Команда: (load "T:/AutoCAD/Data_base/LISP/_SAPR/Model_To_Layouts/VPGallurgy/Start.LSP")
_netload Имя файла сборки: T:\AutoCAD\Data_base\LISP\_SAPR\Model_To_Layouts\VPGallurgy\Release_x64\GAMTL_090915.dll Не удалось загрузить сборку. Сведения об ошибке: System.IO.FileLoadException: Could not load file or assembly 'file:///T:\AutoCAD\Data_base\LISP\_SAPR\Model_To_Layouts\VPGallurgy\Release_x64\GAMTL_090915.dll' or one of its dependencies. Operation is not supported. (Exception from HRESULT: 0x80131515)
File name: 'file:///T:\AutoCAD\Data_base\LISP\_SAPR\Model_To_Layouts\VPGallurgy\Release_x64\GAMTL_090915.dll' ---> System.NotSupportedException: An attempt was made to load an assembly from a network location which would have caused the assembly to be sandboxed in previous versions of the .NET Framework. This release of the .NET Framework does not enable CAS policy by default, so this load may be dangerous. If this load is not intended to sandbox the assembly, please enable the loadFromRemoteSources switch. See http://go.microsoft.com/fwlink/?LinkId=155569 for more information.
   at System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
   at System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection, Boolean suppressSecurityChecks)
   at System.Reflection.RuntimeAssembly.InternalLoadFrom(String assemblyFile, Evidence securityEvidence, Byte[] hashValue, AssemblyHashAlgorithm hashAlgorithm, Boolean forIntrospection, Boolean suppressSecurityChecks, StackCrawlMark& stackMark)
   at System.Reflection.Assembly.LoadFrom(String assemblyFile)
   at Autodesk.AutoCAD.Runtime.ExtensionLoader.Load(String fileName)
   at loadmgd()


Как-то так...
Название: Re: При запуске модуля выдает «nil»?
Отправлено: Александр Пекшев aka Modis от 10-11-2015, 11:58:34
Как-бы.... нужен текст Start.LSP. а не текст ошибки
Название: Re: При запуске модуля выдает «nil»?
Отправлено: Александр Ривилис от 10-11-2015, 12:00:12
Александр меня опередил - только хотел сказать, что в C# нет nil
Не совсем так. На C# можно написать lisp-функцию, которая может, если её вызвать, вернуть nil и это значение может быть напечатано в командной строке.
Название: Re: При запуске модуля выдает «nil»?
Отправлено: Пашин Евгений от 10-11-2015, 12:02:37
Добавлено: хотя может и смысл есть - средствами .Net оказывается нельзя узнать разрядность системы

Модуль находится в сети, а пользователь нажимает кнопочку из палитры в AutoCAD-е, на своем компьютере (а я не в курсе, то ли машина х32 или х64). Поэтому запускается LISP, который определяет разрядность, а затем запускает необходимый модуль (в зависимости от разрядности). Если бы знать как определять это с помощью .NET до запуска модуля, я бы не извращался )))
Название: Re: При запуске модуля выдает «nil»?
Отправлено: Виктор Чекалин от 10-11-2015, 12:03:42
средствами .Net оказывается нельзя узнать разрядность системы
A вот это (https://msdn.microsoft.com/en-us/library/system.environment.is64bitoperatingsystem(VS.100).aspx) разве не то что нужно? Environment.Is64BitOperatingSystem
Название: Re: При запуске модуля выдает «nil»?
Отправлено: Виктор Чекалин от 10-11-2015, 12:06:31
Да и из C# можно всегда выполнить нативный код WinAPI.
Можно вот так вот:
Код - C# [Выбрать]
  1. static bool is64BitProcess = (IntPtr.Size == 8);
  2. static bool is64BitOperatingSystem = is64BitProcess || InternalCheckIsWow64();
  3.  
  4. [DllImport("kernel32.dll", SetLastError = true, CallingConvention = CallingConvention.Winapi)]
  5. [return: MarshalAs(UnmanagedType.Bool)]
  6. private static extern bool IsWow64Process(
  7.     [In] IntPtr hProcess,
  8.     [Out] out bool wow64Process
  9. );
  10.  
  11. public static bool InternalCheckIsWow64()
  12. {
  13.     if ((Environment.OSVersion.Version.Major == 5 && Environment.OSVersion.Version.Minor >= 1) ||
  14.         Environment.OSVersion.Version.Major >= 6)
  15.     {
  16.         using (Process p = Process.GetCurrentProcess())
  17.         {
  18.             bool retVal;
  19.             if (!IsWow64Process(p.Handle, out retVal))
  20.             {
  21.                 return false;
  22.             }
  23.             return retVal;
  24.         }
  25.     }
  26.     else
  27.     {
  28.         return false;
  29.     }
  30. }

Взято отсюда (http://stackoverflow.com/questions/336633/how-to-detect-windows-64-bit-platform-with-net)

Добавлено:
Похоже я поторопился. Нужна ведь разрядность AutoCAD :)
Название: Re: При запуске модуля выдает «nil»?
Отправлено: Александр Пекшев aka Modis от 10-11-2015, 12:06:55
Environment.Is64BitOperatingSystem
Появилось только начиная с версии 4.0, поэтому не всегда подходит некоторым...
Модуль находится в сети, а пользователь нажимает кнопочку из палитры в AutoCAD-е, на своем компьютере (а я не в курсе, то ли машина х32 или х64). Поэтому запускается LISP, который определяет разрядность, а затем запускает необходимый модуль (в зависимости от разрядности). Если бы знать как определять это с помощью .NET до запуска модуля, я бы не извращался )))
Ну если погуглить, то можно найти решение на net - это раз. Два - две dll: первая определяет разрядность, вторая - рабочая

Ну и где код-то?
Название: Re: При запуске модуля выдает «nil»?
Отправлено: Пашин Евгений от 10-11-2015, 12:07:22
A вот это разве не то что нужно? Environment.Is64BitOperatingSystem

Это точно было бы здорово, если бы не одно «НО», нам это нужно как-то сделать до запуска модуля! То есть, эта проверка должна быть запущена до старта модуля!
Название: Re: При запуске модуля выдает «nil»?
Отправлено: Александр Ривилис от 10-11-2015, 12:07:45
Всё из-за этого:
Цитировать
System.NotSupportedException: An attempt was made to load an assembly from a network location which would have caused the assembly to be sandboxed in previous versions of the .NET Framework.
Читаем: http://adndevblog.typepad.com/autocad/2012/09/error-netloading-plugin-from-network-location.html
Название: Re: При запуске модуля выдает «nil»?
Отправлено: Пашин Евгений от 10-11-2015, 12:09:09
Ну и где код-то?

Код - Auto/Visual Lisp [Выбрать]
  1. (if (> (strlen (vl-prin1-to-string (vlax-get-acad-object))) 40)
  2.     (command "_netload" "T:\\AutoCAD\\Data_base\\LISP\\_SAPR\\Model_To_Layouts\\VPGallurgy\\Release_x64\\GAMTL_090915.dll")
  3.     (command "_netload" "T:\\AutoCAD\\Data_base\\LISP\\_SAPR\\Model_To_Layouts\\VPGallurgy\\Release_x32\\GAMTL_090915.dll")
  4. ); end of if
  5. (command "_GALMODELTOLAYOUTS")
  6. (command "_REGENALL")
  7.  


Название: Re: При запуске модуля выдает «nil»?
Отправлено: Александр Пекшев aka Modis от 10-11-2015, 12:10:12
Пашин Евгений, да уже не нужен - тебе дали ответ выше =)
Название: Re: При запуске модуля выдает «nil»?
Отправлено: Пашин Евгений от 10-11-2015, 12:11:16
Читаем: http://adndevblog.typepad.com/autocad/2012/09/error-netloading-plugin-from-network-location.html

Проблема в том, что у пользователя я поставил <loadFromRemoteSources enabled="true"/>, но результат тот же!
А перезагрузку компьютера надо было делать?
Название: Re: При запуске модуля выдает «nil»?
Отправлено: Александр Пекшев aka Modis от 10-11-2015, 12:12:52
А перезагрузку компьютера надо было делать?
нет
http://modplus.org/help/acad-exe-config
Название: Re: При запуске модуля выдает «nil»?
Отправлено: Пашин Евгений от 10-11-2015, 12:14:45
Только что проверил вручную! LISP тут похоже вообще ни причем...
Не работает загрузка самого модуля!
Название: Re: При запуске модуля выдает «nil»?
Отправлено: Пашин Евгений от 10-11-2015, 12:15:47
нет
http://modplus.org/help/acad-exe-config

Проверю... один момент.
Название: Re: При запуске модуля выдает «nil»?
Отправлено: Александр Пекшев aka Modis от 10-11-2015, 12:26:26
Если где-то ошибусь, то Александр Ривилис меня поправит (как обычно), но:
1. Разрядность операционной системы и разрядность автокада могут быть разными
2. В 90% случаев в Net нет особой разницы какая разрядность. Практически всегда подходит AnyCPU. Даже если Вы используете что-то связанное с разрядностью, то это можно делать так-же в одной сборке, используя директивы препроцессора (лично я не умею)
ИМХО
Название: Re: При запуске модуля выдает «nil»?
Отправлено: Александр Ривилис от 10-11-2015, 12:32:03
А перезагрузку компьютера надо было делать?
AutoCAD нужно перезапустить. Ну и убедиться, что этот текст вписан не в поле комментария.
Название: Re: При запуске модуля выдает «nil»?
Отправлено: Александр Ривилис от 10-11-2015, 12:35:26
1. Разрядность операционной системы и разрядность автокада могут быть разными
Да. Но это касалось достаточно старых версий AutoCAD. Уже AutoCAD 2008 был x86/x64 и для того чтобы инсталлировать x86 на x64 нужно было править инсталляционный пакет. А в более новых версиях еще сложнее.
2. В 90% случаев в Net нет особой разницы какая разрядность. Практически всегда подходит AnyCPU. Даже если Вы используете что-то связанное с разрядностью, то это можно делать так-же в одной сборке, используя директивы препроцессора (лично я не умею)
Это если бы Пашин Евгений писал без использования COM/ActiveX, которое зависит от разрядности AutoCAD.
Название: Re: При запуске модуля выдает «nil»?
Отправлено: Пашин Евгений от 10-11-2015, 12:44:22
Александр Пекшев aka Modis, Ваш http://modplus.org/help/acad-exe-config то, что надо. У двоих пользователей это файл вообще по другому выглядел... не знаю почему, вдаваться в суть не буду. Большое спасибо!

Также огромное спасибо Александру Ривилису! Все оперативно сработали.
Название: Re: При запуске модуля выдает «nil»?
Отправлено: Пашин Евгений от 10-11-2015, 12:45:42
Это если бы Пашин Евгений писал без использования COM/ActiveX, которое зависит от разрядности AutoCAD.

Я работаю над этим! ))))


Проверил у еще четверых... странно, но у них работает и без дополнительного тега???? Это как так? Может потому что х32?
Название: Re: При запуске модуля выдает «nil»?
Отправлено: Александр Ривилис от 10-11-2015, 12:46:29
У двоих пользователей это файл вообще по другому выглядел... не знаю почему, вдаваться в суть не буду
А зря. В разных версиях AutoCAD он может быть существенно разным.
Название: Re: При запуске модуля выдает «nil»?
Отправлено: Александр Ривилис от 10-11-2015, 12:50:57
Проверил у еще четверых... странно, но у них работает и без дополнительного тега? ??? Это как так? Может потому что х32?
Зависит от версии AutoCAD и .NET и настроек .NET в системе.
Еще один вариант: http://adndevblog.typepad.com/aec/2012/05/revit-add-in-does-not-do-anything-after-clicking-the-add-in-command-in-the-user-interface.html (http://adndevblog.typepad.com/aec/2012/05/revit-add-in-does-not-do-anything-after-clicking-the-add-in-command-in-the-user-interface.html)

(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Flabs.blogs.com%2F.a%2F6a00d8341caed853ef014e886a813c970d-pi&hash=bafa7ebf6995a58a250a59e88f922e6b)
Название: Re: При запуске модуля выдает «nil»?
Отправлено: Пашин Евгений от 10-11-2015, 13:29:28
Так-так-так, это что же получается, если я отправлял библиотеку по почте, то на ней ставилась какая-то блокировка, а если ложил в сетевую папку, то все хорошо!

P.S. Александр, Вы просто спаситель мой ))) Я тут кучу CHM-файлов скачал, всяческих справочников и они у меня не открывались, или некорректно открывались. После того как снял блокировку, они, вуаля и работают! Спасибо огромное.
Название: Re: При запуске модуля выдает «nil»?
Отправлено: Пашин Евгений от 10-11-2015, 13:31:55
А зря. В разных версиях AutoCAD он может быть существенно разным.

Да, не такие как те, которые мне дал Александр Пекшев aka Modis... Буду внимательнее!