Ошибка при десериализации файла в AutoCAD

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

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

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

  • ADN OPEN
  • Сообщений: 16
  • Карма: 0
Добрый день! Прошу прощения, что долго не отвечал.
AutoCAD 2016. Нет, GraphAssembly.dll на компьютере

Код - C# [Выбрать]
  1. using System;
  2. using System.Diagnostics;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Runtime.Serialization;
  6. using System.Runtime.Serialization.Formatters.Binary;
  7. using GraphAssembly;
  8.  
  9. namespace ConsoleApp20
  10. {
  11.     class Program
  12.     {
  13.         static void Main(string[] args)
  14.         {
  15.             var path = new DirectoryInfo(@"C:\Temp");
  16.             var pathTofileGraph = Path.Combine(path.FullName, "graphRevit.txt");
  17.             if (File.Exists(pathTofileGraph))
  18.             {
  19.                 var res = new GraphAssembly.Graph();
  20.                 using (var s = File.Open(pathTofileGraph, FileMode.Open))
  21.                 {
  22.                     var bFormatter = new BinaryFormatter();
  23.                     bFormatter.AssemblyFormat =
  24.                         System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Full;
  25.                     bFormatter.Binder = new MyBinder(); // MyBinder class code given below
  26.                     try
  27.                     {
  28.                         res = (Graph)bFormatter.Deserialize(s);
  29.                     }
  30.                     catch (SerializationException se)
  31.                     {
  32.                         Console.WriteLine(se.Message);
  33.                     }
  34.                 }
  35.             }
  36.             Console.WriteLine("ok");
  37.             Console.ReadKey();
  38.         }
  39.     }
  40.     internal sealed class MyBinder : SerializationBinder
  41.     {
  42.         public override Type BindToType(string assemblyName, string typeName)
  43.         {
  44.             Type ttd = null;
  45.             try
  46.             {
  47.                 var toassname = assemblyName.Split(',')[0];
  48.                 var asmblies = AppDomain.CurrentDomain.GetAssemblies();
  49.                 foreach (var ass in asmblies)
  50.                 {
  51.                     if (ass.FullName.Split(',')[0] == toassname)
  52.                     {
  53.                         var types = ass.GetTypes().Where(x => x.ContainsGenericParameters);
  54.  
  55.                         ttd = ass.GetType(typeName, false, true);
  56.                         if (ttd is null)
  57.                         {
  58.                             Debug.WriteLine($"Не найден тип \"{typeName}\" в сборке {toassname}");
  59.                         }
  60.                         else break;
  61.                     }
  62.                 }
  63.             }
  64.             catch (System.Exception e)
  65.             {
  66.                 Console.WriteLine(e.Message);
  67.             }
  68.             return ttd;
  69.         }
  70.     }
  71. }
  72.  
  73.  

Странно то, что этот код консольного приложения работает!

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

  • ADN OPEN
  • Сообщений: 16
  • Карма: 0
Файлы для работы

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Так какая версия автокада?

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

  • ADN OPEN
  • Сообщений: 16
  • Карма: 0
AutoCAD 2016

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 534
  • Карма: 117
Подскажите, пожалуйста, с чем это может быть связано, как исправить?
Возможно дело в:
AutoCAD 2016 .NET 4.5

GraphAssembly7073.dll
System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.6")]

Найди/перекомпилируй файл GraphAssembly для .NET 4.5

Скорее всего в свежих версиях AutoCAD 2017-2018 (.NET 4.6) или AutoCAD 2019 (.NET 4.7) все будет ОК.

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

  • ADN OPEN
  • Сообщений: 16
  • Карма: 0
Код - C# [Выбрать]
  1. internal sealed class MyBinder : SerializationBinder
  2.     {
  3.         public override Type BindToType(string assemblyName, string typeName)
  4.         {
  5.             Type ttd = null;
  6.             try
  7.             {
  8.                 var toassname = assemblyName.Split(',')[0];
  9.                 var asmblies = AppDomain.CurrentDomain.GetAssemblies();
  10.                 foreach (var ass in asmblies)
  11.                 {
  12.                     if (ass.FullName.Split(',')[0] == toassname)
  13.                     {
  14.                         var types = ass.GetTypes().Where(x => x.ContainsGenericParameters);
  15.  
  16.                         ttd = ass.GetType(typeName, false, true);
  17.                         if (ttd is null)
  18.                         {
  19.                             switch (typeName)
  20.                             {
  21.                                 case "System.Collections.Generic.Dictionary`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[GraphAssembly.Node, GraphAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]":
  22.                                         ttd = typeof(Dictionary<string, Node>);
  23.                                         break;
  24.                                 case "System.Collections.Generic.List`1[[GraphAssembly.Section, GraphAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]":
  25.                                     ttd = typeof(List<Section>);
  26.                                     break;
  27.                                 case "System.Collections.Generic.KeyValuePair`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[GraphAssembly.Node, GraphAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]":
  28.                                     ttd = typeof(System.Collections.Generic.KeyValuePair<string,Node>);
  29.                                     break;
  30.                                 case "System.Collections.Generic.List`1[[GraphAssembly.Cable, GraphAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]":
  31.                                     ttd = typeof(List<Cable>);
  32.                                     break;
  33.                                 default:
  34.                                     Debug.WriteLine($"Не найден тип \"{typeName}\" в сборке {toassname}");
  35.                                     break;
  36.                             }
  37.                         }
  38.                         else break;
  39.                     }
  40.                 }
  41.             }
  42.             catch (System.Exception e)
  43.             {
  44.                 Debug.WriteLine(e.Message);
  45.             }
  46.             return ttd;
  47.         }
  48.     }
Придумал пока такой костыль, вроде помогло.
После компиляции для .NET 4.5 при отладке всё равно попадаем в блок switch.....

Спасибо за помощь!!!