Ошибка при десериализации в ACAD

Автор Тема: Ошибка при десериализации в ACAD  (Прочитано 17037 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

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

  • ADN OPEN
  • Сообщений: 25
  • Карма: 0
Доброе время суток!
Почти год изучаю программирование на С# но это первое обращение за помощью.
Проблема в следующем - в Windows Form вводятся данные и выполняются расчёты, которые сохраняются (сериализуются) в бинарном файле.
Сами данные - реализация класса многоуровнего, со встроенными списками и т.д. оформленного в отдельный DLL (EE_LigtingVarDLL)
Загрузке данного бинарного файла обратно в Windows Form для редактирования проходит без проблем.
При попытке загрузить из ACAD (для вывода собственно в графическом виде), выходит исключение:
{"Не удалось найти сборку \"EE_LigtingVarDLL, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\"."}.
Немного походив по форумам процедуру чтения-записи оформил тоже в DLL (MyIO)
Но ничего не изменилось.
текст DLL (MyIO):

Код - C# [Выбрать]
  1. using EE_LightingVarDLL;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.IO;
  5. using System.IO.Compression;
  6. using System.Linq;
  7. using System.Runtime.Serialization.Formatters.Binary;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10.  
  11. namespace MyIO
  12. {
  13.     public class My_IO_DLL
  14.     {
  15.         public LightingVar LoadConfiguration(string filename)//Процедура считывания из файла
  16.         {
  17.             LightingVar serLv = null;
  18.             try
  19.             {
  20.                 using (Stream stream = File.Open(filename, FileMode.Open))
  21.                 {
  22.                     BinaryFormatter bformatter = new BinaryFormatter();
  23.                     serLv = (LightingVar)bformatter.Deserialize(stream);
  24.                     stream.Close();
  25.                 }
  26.                 serLv.errorIO = false;
  27.             }
  28.             catch (Exception ex)
  29.             {
  30.  
  31.             }
  32.             return serLv;
  33.         }
  34.  
  35.         public string SaveConfiguration(string filename, LightingVar lv)//Процедура сохранения в файл
  36.         {
  37.             try
  38.             {
  39.                 using (Stream stream = File.Open(filename, FileMode.Create))
  40.                 {
  41.                     BinaryFormatter bformatter = new BinaryFormatter();
  42.                     bformatter.Serialize(stream, lv);
  43.                     stream.Close();
  44.                 }
  45.                 return "OK";
  46.             }
  47.             catch (Exception ex)
  48.             {
  49.                 return ex.Message;
  50.             }
  51.         }
  52.     }
  53. }

Исключение выходит на строке:
serLv = (LightingVar)bformatter.Deserialize(stream);
конкретно при прохождении stream
Несколько дней сижу с этой проблемой, не знаю что делать. Сам я чертёжник, пишу для оптимизации своего труда, коллеги ничего в программировании не смыслят.
Заранее спасибо.
« Последнее редактирование: 08-10-2017, 13:39:19 от Александр Ривилис »

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Ошибка при десериализации в ACAD
« Ответ #1 : 08-10-2017, 12:11:01 »
Попробуйте свою библиотеку, которая не находится,  предварительно загрузить с помощью Assembly.LoadFrom()

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Ошибка при десериализации в ACAD
« Ответ #2 : 08-10-2017, 13:45:48 »
Iurii
Приветствую на форуме!
1. Прочитайте у меня в подписи о том, как следует форматировать код на форуме.
2. Серилизация класса .NET в базу чертежа AutoCAD
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Re: Ошибка при десериализации в ACAD
« Ответ #3 : 08-10-2017, 17:03:34 »
Положите EE_LigtingVarDLL рядом с основной DLL. Возможно, надо просто поставить её свойство "copy local" в "true".


Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Ошибка при десериализации в ACAD
« Ответ #4 : 08-10-2017, 17:12:36 »
Положите EE_LigtingVarDLL рядом с основной DLL
А вот это как раз чаще всего и не срабатывает. В отличие от exe-файла, для которого его dll-файлы ищутся в том числе и в этой же директории, для dll-файла поиск рядом (т.е. в его каталоге) не осуществлется. Поэтому или прямая загрузка или вот такой фортель:
http://adndevblog.typepad.com/autocad/2014/01/pnp3dobjectsmgd-not-found-exception.html
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Re: Ошибка при десериализации в ACAD
« Ответ #5 : 08-10-2017, 17:25:46 »
А вот это как раз чаще всего и не срабатывает.
Странно это. Я всегда так делал: сборку в референсы и клал рядом - подгружает её без проблем. А в статье по ссылке, как я понял, рассказывается о том, что плантовскую dll положили во вложенную папку и acad.exe её не находит из-за этого. Если бы рядом лежала  - проблем не было бы.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Ошибка при десериализации в ACAD
« Ответ #6 : 08-10-2017, 17:45:36 »
Я всегда так делал: сборку в референсы и клал рядом - подгружает её без проблем.
Тогда ещё одна статья: http://adndevblog.typepad.com/autocad/2012/04/load-additional-dlls.html
То как работает у тебя это или из-за того, что используется механизм автозагрузки или эти dll-файлы в путях доступа AutoCAD.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Re: Ошибка при десериализации в ACAD
« Ответ #7 : 08-10-2017, 17:58:13 »
То как работает у тебя это или из-за того, что используется механизм автозагрузки или эти dll-файлы в путях доступа AutoCAD.
Ни то, ни другое! Уже не вспомню, с каких пор я так делаю и как к этому пришёл. Но мне это казалось настолько очевидным, что я даже сейчас в некотором недоумении.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Ошибка при десериализации в ACAD
« Ответ #8 : 08-10-2017, 18:02:33 »
Уже не вспомню, с каких пор я так делаю и как к этому пришёл.
Кстати в разных версиях AutoCAD это работает по-разному.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 25
  • Карма: 0
Re: Ошибка при десериализации в ACAD
« Ответ #9 : 08-10-2017, 18:39:59 »
Спасибо всем!
Итак:
1. предварительно загрузить с помощью Assembly.LoadFrom() - не помогло(никаких изменений)
2. Возможно, надо просто поставить её свойство "copy local" в "true" - так вроде (по крайней мере у меня) и так автоматически ставиться в это положение. Это AutoCAD DLL надо вручную отключать. Я специально чистил референсы, все подключаемые DLL после перекомпиляции в нужных местах.
3. С англоязычными кейсами буду разбираться.
4. Не написал сразу, на более раннем этапе, сериализовал  только список (List<>), он без проблем работал и в Form и в ACAD, без общих DLL, просто одинаковый код. После этого переосмыслил схему обработки информации и сделал Class со структурой списков и спокойно писал в Form собственно ввод и обработку данных. Вот здесь и случился затык - понабилось оформлять в результаты в ACAD, а этот Class в ACAD не дессиаризуется.
5. ACAD 2015
Спасибо.

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Re: Ошибка при десериализации в ACAD
« Ответ #10 : 08-10-2017, 18:45:26 »
Вам бы сперва разобраться с чем бороться: то ли с реализацией сериализации, то ли с поиском вспомогательных сборок...

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

  • ADN OPEN
  • Сообщений: 25
  • Карма: 0
Re: Ошибка при десериализации в ACAD
« Ответ #11 : 08-10-2017, 18:55:12 »
Так они сами расставляются - вроде как-то так

или я не правильно понимаю, в Forms все работает идеально

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Re: Ошибка при десериализации в ACAD
« Ответ #12 : 08-10-2017, 18:57:22 »
Если всё в одну сборку поместить - работает?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Ошибка при десериализации в ACAD
« Ответ #13 : 08-10-2017, 19:26:43 »
Если всё в одну сборку поместить - работает?
Очень правильный вопрос!
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 25
  • Карма: 0
Re: Ошибка при десериализации в ACAD
« Ответ #14 : 08-10-2017, 19:31:38 »
Сделал всё в одной сборке, но ситуация не поменялась.
То есть, при десериализации он пишет:
{"Не удалось найти сборку \"EE_LigtingVarDLL, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\"."}
хотя сам находится в этой сборке.