2015-04-16 3 views
2

Я работаю над возможностью сериализации объектов C# для объектов AutoCAD. У меня есть метод, который их сериализует, и я пытаюсь вызвать этот метод из командной строки AutoCAD, предназначенного для десериализации.C# Не удается привязать к целевому методу

  [CommandMethod("OpenXRecord", CommandFlags.Modal)] 
      public SerializeTest XMLOpen() 
      { 
       Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument; 
       Editor ed = doc.Editor; 
       Database db = doc.Database; 
       SerializeTest retval = null; 
       XmlSerializer serializer = new XmlSerializer(typeof(SerializeTest)); 
       using (Transaction tr = db.TransactionManager.StartTransaction()) 
       using (DocumentLock docLock = doc.LockDocument()) 
       { 
        PromptSelectionResult acSSPrompt = ed.GetSelection(); 
        if (acSSPrompt.Status == PromptStatus.OK) 
        { 
         ObjectId[] ids = acSSPrompt.Value.GetObjectIds(); 
         Entity acadObj = tr.GetObject(ids[0], OpenMode.ForWrite) as Entity; 
         if (acadObj == null || acadObj.ExtensionDictionary == ObjectId.Null) 
         { 
          tr.Abort(); 
          return retval; 
         } 
         using (DBDictionary dict = tr.GetObject(acadObj.ExtensionDictionary, OpenMode.ForRead, false) as DBDictionary) 
         { 
          if (dict.Contains("KW_PID")) 
          { 
           using (Xrecord xrec = tr.GetObject(dict.GetAt("KW_PID"), OpenMode.ForRead) as Xrecord) 
           { 
            if (xrec != null) 
            { 
             using (ResultBuffer rb = xrec.Data) 
             { 
              if (rb != null) 
              { 
               using (MemoryStream stream = new MemoryStream()) 
               { 
                TypedValue[] tvs = rb.AsArray(); 
                if (tvs != null) 
                { 
                 if (tvs[0].TypeCode == (short)DxfCode.Text) 
                 { 
                  string xmlString = ""; 
                  TextWriter writer = new StreamWriter(stream); 
                  for (int i = 1; i < tvs.Length; i++) 
                  { 
                   if (tvs[i].TypeCode == (short)DxfCode.Text) 
                   { 
                    xmlString = (string)tvs[i].Value; writer.Write(xmlString); 
                   } 
                  } 
                  writer.Flush(); 
                  stream.Position = 0; 
                  retval = serializer.Deserialize(stream) as SerializeTest; 
                 } 
                } 
               } 
              } 
             } 
            } 
           } 
          } 
         } 
        } 
       } 
       return retval; 
      } 

Однако, когда я называю его, я поздоровался с этой ошибкой и понятия не имею, почему, как это не дает номера строк или полезную информацию для отладки.

enter image description here

+0

hmmm, вы не используете '{' after' using (Transaction tr = db.TransactionManager.StartTransaction()) 'при публикации этого объявления? – MickyD

+2

Нет, синтаксис C# позволяет вам складывать с помощью операторов, а затем иметь один набор {} для всех из них –

+0

Neat. _How_ этот прогон? Это плагин для AutoCAD? Если это так, попробуйте добавить Visual Studio к нему или из вашего проекта в Visual Studio, установите Debug ** Startup ** в AutoCAD и отлаживайте его. Это будет VS будет загружать вашу dll сначала (я предполагаю, что это DLL) и отладочную информацию до запуска AC. То же самое относится, если вы запускаете какой-нибудь инструмент командной строки AC, возможно? – MickyD

ответ

1

Фигурные его, этот метод должен быть недействительным или иначе он будет злиться и бросить эту ошибку.

0

В идеале командные методы будут:

государственной статической силы MethodName()

Если статический сделает AutoCAD не экземпляр класса для вызова команды. Кроме того, не следует принимать какие-либо параметры.

И если вы не Commit() сделки, AutoCAD будет предполагать Abort(), поэтому вам может понадобиться вызвать его к концу вашей жизни.

Смежные вопросы