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

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

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

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

  • ADN OPEN
  • Сообщений: 25
  • Карма: 0
Re: Ошибка при десериализации в ACAD
« Ответ #15 : 08-10-2017, 19:38:00 »
Файл, который не может считаться создан и считывается без проблем в Forms

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Re: Ошибка при десериализации в ACAD
« Ответ #16 : 08-10-2017, 19:43:16 »
Сделал всё в одной сборке, но ситуация не поменялась.
То есть, при десериализации он пишет:
{"Не удалось найти сборку \"EE_LigtingVarDLL, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\"."}
хотя сам находится в этой сборке.
Такого не должно быть. Если все методы внутри сборки, она не должна искать что-то вне себя. Либо где-то в референсах осталась ссылка на эту DLL, либо вообще грузится какой-то не тот файл. Разбирайтесь.

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

  • ADN OPEN
  • Сообщений: 25
  • Карма: 0
Re: Ошибка при десериализации в ACAD
« Ответ #17 : 08-10-2017, 19:44:38 »
Хорошо,буду разбираться.
Спасибо.

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

  • ADN OPEN
  • Сообщений: 25
  • Карма: 0
Re: Ошибка при десериализации в ACAD
« Ответ #18 : 08-10-2017, 19:47:35 »
А, кстати, когда делаю точку останова, и пошаговое выполнение, то он заходит в нужную сборку.

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Re: Ошибка при десериализации в ACAD
« Ответ #19 : 08-10-2017, 19:54:23 »
Ну раз так, то что вызывает ошибку? Явно она уже не в момент захода "в нужную сборку" выскакивает.

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

  • ADN OPEN
  • Сообщений: 25
  • Карма: 0
Re: Ошибка при десериализации в ACAD
« Ответ #20 : 10-10-2017, 18:49:14 »
Я не знаю,что делать
переписал всё максимально упрощённо, создал другие проекты
вот DLL:
Код - C# [Выбрать]
  1. using System;
  2. namespace Test_DLL
  3. {
  4.     [Serializable]
  5.     public class LightingVar
  6.     {
  7.         public int light = 2;
  8.     }
  9. }
  10.  
Вот приложение под Forms:
Код - C# [Выбрать]
  1. using System;
  2. using System.IO;
  3. using System.Runtime.Serialization.Formatters.Binary;
  4. using System.Windows.Forms;
  5. using Test_DLL;
  6. namespace TestWin
  7. {
  8.     public partial class Form1 : Form
  9.     {
  10.         public LightingVar lv = new LightingVar();
  11.         public string filename;
  12.         public Form1()
  13.         {
  14.             InitializeComponent();
  15.             textBox1.Text = "" + lv.light;
  16.         }
  17.         private void button2_Click(object sender, EventArgs e) // Чтение
  18.         {
  19.             openFileDialog1 .Filter = "Bin files(*.bin)|*.bin|All files(*.*)|*.*";
  20.             if (openFileDialog1.ShowDialog() == DialogResult.Cancel)
  21.                 return;
  22.             string filename = openFileDialog1.FileName;
  23.             LoadConfiguration(filename);
  24.             textBox1.Text = "" + lv.light;
  25.         }
  26.         public int LoadConfiguration(string filename)//Процедура с читывания из файла
  27.         {
  28.             LightingVar ser = null;
  29.             try
  30.             {
  31.                 using (Stream stream = File.Open(filename, FileMode.Open))
  32.                 {
  33.                     BinaryFormatter bformatter = new BinaryFormatter();
  34.                     ser = (LightingVar)bformatter.Deserialize(stream);
  35.                     stream.Close();
  36.                 }
  37.                 lv = ser;
  38.             }
  39.             catch (Exception ex) { }
  40.             return 0;
  41.         }
  42.  
  43.         private void button1_Click(object sender, EventArgs e) // Запись
  44.         {
  45.             lv.light++;
  46.             saveFileDialog1.Filter = "Bin files(*.bin)|*.bin|All files(*.*)|*.*";
  47.             if (saveFileDialog1.ShowDialog() == DialogResult.Cancel)
  48.                 return;
  49.             string filename = saveFileDialog1.FileName;
  50.             SaveConfiguration(filename);
  51.         }
  52.         internal int SaveConfiguration(string Filename)//Процедура сохранения в файл
  53.         {
  54.             try
  55.             {
  56.                 using (Stream stream = File.Open(Filename, FileMode.Create))
  57.                 {
  58.                     BinaryFormatter bformatter = new BinaryFormatter();
  59.                     bformatter.Serialize(stream, lv);
  60.                     stream.Close();
  61.                 }
  62.             }
  63.             catch (Exception ex) { }
  64.             return 0;
  65.         }
  66.     }
  67. }
Всё работает отлично, сохраняю, при загрузке этого же файла значение в текстбоксе увеличивается на 1
При загрузке в ACAD, вылетает исключение, что не может найти сборку Test_DLL, и это скомпилированной программы, где класс LightingVar выделяется как опознанный
вот программа для ACAD:
Код - C# [Выбрать]
  1. using Autodesk.AutoCAD.Runtime;
  2. using System.IO;
  3. using System.Runtime.Serialization.Formatters.Binary;
  4. using Test_DLL;
  5.  
  6. namespace TestACAD
  7. {
  8.     public class Class1
  9.     {
  10.         [CommandMethod ("zz")]
  11.         public void cad()
  12.         {
  13.             string filename = @"C:\test\3.bin";
  14.             LightingVar lv = new LightingVar();
  15.             LightingVar ser = null;
  16.             try
  17.             {
  18.                 using (Stream stream = File.Open(filename, FileMode.Open))
  19.                 {
  20.                     BinaryFormatter bformatter = new BinaryFormatter();
  21.                     ser = (LightingVar)bformatter.Deserialize(stream); // ВОТ ЗДЕСЬ ВЫХОДИТ В CATCH
  22.                     stream.Close();
  23.                 }
  24.                 lv = ser;
  25.             }
  26.             catch (System.Exception ex) { }
  27.         }
  28.     }
  29. }
« Последнее редактирование: 10-10-2017, 20:02:37 от Александр Ривилис »

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Ошибка при десериализации в ACAD
« Ответ #21 : 10-10-2017, 18:56:40 »
Приложите решение (проекты) для тестов
И используйте форматирование кода в ваших ответах

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

  • ADN OPEN
  • Сообщений: 25
  • Карма: 0
Re: Ошибка при десериализации в ACAD
« Ответ #22 : 10-10-2017, 18:59:50 »
Добрый вечер!
Высылаю.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Ошибка при десериализации в ACAD
« Ответ #23 : 10-10-2017, 20:06:22 »
Iurii
Второй (и последний) раз предупреждаю о правиле форматирования кода на форуме. Читай у меня в подписи.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 25
  • Карма: 0
Re: Ошибка при десериализации в ACAD
« Ответ #24 : 10-10-2017, 21:23:36 »
Насчёт форматирования кода - приношу извинения, разобрался, больше не буду.

Отмечено как Решение Александр Ривилис 11-10-2017, 12:50:36

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Ошибка при десериализации в ACAD
« Ответ #25 : 10-10-2017, 22:34:09 »



Код - C# [Выбрать]
  1. using System;
  2. using Autodesk.AutoCAD.Runtime;
  3. using System.IO;
  4. using System.Runtime.Serialization.Formatters.Binary;
  5. using Test_DLL;
  6.  
  7. namespace TestACAD
  8. {
  9.     public class MyApp : IExtensionApplication
  10.     {
  11.         public void Initialize()
  12.         {
  13.             AppDomain currentDomain = AppDomain.CurrentDomain;
  14.             currentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
  15.         }
  16.  
  17.         public void Terminate()
  18.         {
  19.             //nothing
  20.         }
  21.         private System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
  22.         {
  23.             System.Reflection.Assembly[] asms = AppDomain.CurrentDomain.GetAssemblies();
  24.             for (int i = 0; i < asms.Length; ++i)
  25.             {
  26.                 if (asms[i].FullName == args.Name)
  27.                     return asms[i];
  28.             }
  29.             return null;
  30.         }
  31.     }
  32.     public class Class1
  33.     {
  34.         [CommandMethod ("zz")]
  35.         public void cad()
  36.         {
  37.             string filename = @"C:\test\3.bin";
  38.             LightingVar lv = new LightingVar();
  39.             LightingVar ser = null;
  40.             try
  41.             {
  42.                 using (Stream stream = File.Open(filename, FileMode.Open))
  43.                 {
  44.                     BinaryFormatter bformatter = new BinaryFormatter();
  45.                     ser = (LightingVar)bformatter.Deserialize(stream);
  46.                     stream.Close();
  47.                 }
  48.                 lv = ser;
  49.                 Autodesk.AutoCAD.ApplicationServices.Core.Application.DocumentManager.MdiActiveDocument.Editor
  50.                     .WriteMessage("!!!!!!");
  51.             }
  52.             catch (System.Exception ex)
  53.             {
  54.                 Autodesk.AutoCAD.ApplicationServices.Core.Application
  55.                     .DocumentManager.MdiActiveDocument.Editor.WriteMessage(ex.Message);
  56.             }
  57.         }
  58.     }
  59. }

На вопрос "Почему" ответа не дам. Это просто магия )))

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Ошибка при десериализации в ACAD
« Ответ #26 : 10-10-2017, 23:03:40 »
На вопрос "Почему" ответа не дам. Это просто магия )))
Я что-то пропустил или сборка действительно без AssemblyResolve не грузилась?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Ошибка при десериализации в ACAD
« Ответ #27 : 10-10-2017, 23:08:31 »
Я что-то пропустил или сборка действительно без AssemblyResolve не грузилась?
Нет, тут проблема не в этом и с автокадом не связана.
Проблема с сериализацией в бинарный формат, когда работа происходит в разных приложениях. Ответ (и точно такую-же проблему) нашёл тут
Смахивает на косяк в .Net framework, хотя может проблема в чем-то особенном

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Ошибка при десериализации в ACAD
« Ответ #28 : 10-10-2017, 23:27:52 »
Нет, тут проблема не в этом и с автокадом не связана.
Александр Пекшев aka Modis
Я где-то про AutoCAD писал??? Фактически подписка на AssemblyResolve перенаправляла все LoadFrom на обработчик события и давала возможность явной подстановки нужной сборки. Важно только чтобы эта сборка уже была загружена в AppDomain.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Ошибка при десериализации в ACAD
« Ответ #29 : 10-10-2017, 23:42:49 »
Я где-то про AutoCAD писал???
Я не имел ввиду, что вы про это говорили) Я имел ввиду, что речь идет в общем контексте работы в автокаде

Кстати, правильный ответ и ссылку Вы дали еще в начале обсуждения )
А вот это как раз чаще всего и не срабатывает. В отличие от exe-файла, для которого его dll-файлы ищутся в том числе и в этой же директории, для dll-файла поиск рядом (т.е. в его каталоге) не осуществлется. Поэтому или прямая загрузка или вот такой фортель:
http://adndevblog.typepad.com/autocad/2014/01/pnp3dobjectsmgd-not-found-exception.html
Точнее - там что-то похожее. Вариант, который я нашел короче и проще