5

Sto tentando di creare un codice che può serializzare e deserializzare una libreria di classi in un disegno AutoCAD. Questa domanda ha poco a che vedere con AutoCAD se non perché non è possibile eseguirne il debug con mezzi normali. Ho iniziato questo progetto da this article e ho ottenuto con successo il suo codice per l'esecuzione. Comunque il modo in cui il suo codice è strutturato, mi richiederebbe che tutte le mie classi ereditassero dal suo oggetto base. Poiché questo è chiaramente un odore di codice, sapevo che avevo bisogno di creare un'interfaccia invece. Di seguito è il codice che ho finito con.Codice di serializzazione causa eccezione non gestita

Questa prima sezione è il codice responsabile della serializzazione in un disegno AutoCAD.

La seconda sezione è un esempio di una classe che implementa mia abitudine interfaccia serializzazione

public class Commands 
{ 
    public class MyUtil 
    { 

     const int kMaxChunkSize = 127; 

     public ResultBuffer StreamToResBuf(MemoryStream ms, string appName) 
     { 

      ResultBuffer resBuf = new ResultBuffer(new TypedValue((int)DxfCode.ExtendedDataRegAppName, appName)); 

      for (int i = 0; i < ms.Length; i += kMaxChunkSize) 
      { 

       int length = (int)Math.Min(ms.Length - i, kMaxChunkSize); 

       byte[] datachunk = new byte[length]; 

       ms.Read(datachunk, 0, length); 

       resBuf.Add(new TypedValue((int)DxfCode.ExtendedDataBinaryChunk, datachunk)); 
      } 

      return resBuf; 
     } 

     public MemoryStream ResBufToStream(ResultBuffer resBuf) 
     { 

      MemoryStream ms = new MemoryStream(); 

      TypedValue[] values = resBuf.AsArray(); 

      // Start from 1 to skip application name 

      for (int i = 1; i < values.Length; i++) 
      { 

       byte[] datachunk = (byte[])values[i].Value; 

       ms.Write(datachunk, 0, datachunk.Length); 

      } 

      ms.Position = 0; 

      return ms; 

     } 

     public void NewFromEntity(IClearspanSerializable objectToSave, Entity ent) 
     { 

      using (ResultBuffer resBuf = ent.GetXDataForApplication("Member")) 
      { 
       BinaryFormatter bf = new BinaryFormatter(); 

       bf.Binder = new MyBinder(); 

       MemoryStream ms = this.ResBufToStream(resBuf); 
       objectToSave.SetObjectData(bf.Deserialize(ms)); 
      } 

     } 


     public void SaveToEntity(IClearspanSerializable objectToSave, Entity ent) 
     { 

      // Make sure application name is registered 
      // If we were to save the ResultBuffer to an Xrecord.Data, 
      // then we would not need to have a registered application name 

      Transaction tr = ent.Database.TransactionManager.TopTransaction; 

      RegAppTable regTable = (RegAppTable)tr.GetObject(ent.Database.RegAppTableId, OpenMode.ForWrite); 

      if (!regTable.Has("Member")) 
      { 
       RegAppTableRecord app = new RegAppTableRecord(); 

       app.Name = "Member"; 

       regTable.Add(app); 

       tr.AddNewlyCreatedDBObject(app, true); 
      } 


      BinaryFormatter bf = new BinaryFormatter(); 
      MemoryStream ms = new MemoryStream(); 

      bf.Serialize(ms, objectToSave); 
      ms.Position = 0; 

      ent.XData = this.StreamToResBuf(ms, "Member");; 


     } 
    } 

    public sealed class MyBinder : SerializationBinder 
    { 
     public override Type BindToType(string assemblyName, string typeName) 
     { 
      return Type.GetType(string.Format("{0}, {1}", 

       typeName, assemblyName)); 
     } 
    } 


    [CommandMethod("SaveClassToEntityXData", CommandFlags.Modal)] 
    public void SaveClassToEntityXData(IClearspanSerializable objectToSerialize) 
    { 

     Database db = Application.DocumentManager.MdiActiveDocument.Database; 
     Editor ed = Application.DocumentManager.MdiActiveDocument.Editor; 

     PromptEntityResult per = ed.GetEntity("Select entity to save class to:\n"); 

     if (per.Status != PromptStatus.OK) 
      return; 

     MyUtil util = new MyUtil(); 



     // Save it to the document 
     using (Transaction tr = db.TransactionManager.StartTransaction()) 
     { 

      Entity ent = (Entity)tr.GetObject(per.ObjectId, OpenMode.ForWrite); 

      util.SaveToEntity(objectToSerialize, ent); 

      tr.Commit(); 
     } 

     // Write some info about the results 

     //ed.WriteMessage("Content of MyClass we serialized:\n {0} \n", mc.ToString()); 

    } 


    [CommandMethod("GetClassFromEntityXData", CommandFlags.Modal)] 
    public void GetClassFromEntityXData(IClearspanSerializable objectToRestore) 
    { 

     Database db = Application.DocumentManager.MdiActiveDocument.Database; 
     Editor ed = Application.DocumentManager.MdiActiveDocument.Editor; 

     MyUtil util = new MyUtil(); 

     PromptEntityResult per = ed.GetEntity("Select entity to get class from:\n"); 

     if (per.Status != PromptStatus.OK) 
      return; 

     // Get back the class 
     using (Transaction tr = db.TransactionManager.StartTransaction()) 
     { 
      Entity ent = (Entity)tr.GetObject(per.ObjectId, OpenMode.ForRead); 
      util.NewFromEntity(objectToRestore, ent); 

      tr.Commit(); 

     } 

    } 
} 

Ecco una classe fittizia che sto cercando di testare con:

[Serializable] 
public class MattMember: IClearspanSerializable 
{ 
    public string Name; 
    List<int> MattsInts; 


    public MattMember(string passedName, List<int> passedInts) 
    { 
     Name = passedName; 
     MattsInts = passedInts; 
    } 

    [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.SerializationFormatter)] 
    public void GetObjectData(SerializationInfo info, StreamingContext context) 
    { 
     info.AddValue("Name", Name); 
     info.AddValue("MattsInts", MattsInts); 
    } 

    [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.SerializationFormatter)] 
    public void SetObjectData(SerializationInfo info, StreamingContext context) 
    { 
     if (info == null) 
     { 
      throw new System.ArgumentNullException("info"); 
     } 
     Name = (string)info.GetValue("Name", typeof(string)); 

     MattsInts = (List<int>)info.GetValue("MattsInts", typeof(List<int>)); 
    } 


    void IClearspanSerializable.SetObjectData(object objectInDisguise) 
    { 


     if (objectInDisguise == null) 
     { 
      throw new System.ArgumentNullException("info"); 
     } 

     MattMember objectToCopy = (MattMember)objectInDisguise; 

     Name = objectToCopy.Name; 

     MattsInts = objectToCopy.MattsInts; 
    } 
} 

e qui è l'interfaccia :

public interface IClearspanSerializable 
{ 
    void GetObjectData(SerializationInfo info, StreamingContext context); 
    void SetObjectData(object objectInDisguise); 
} 

Quando si tenta di eseguire il codice all'interno di AutoCAD, tutto ciò che ottengo è err o. Il che mi porta a credere che ci sia un bug nella mia inizializzazione delle mie lezioni. Non vengono colpiti i miei punti di interruzione.

Unhandled Exception

Come devo eseguire il debug di questo? e dove ho rovinato la mia inizializzazione?

[EDIT] -Ecco è ciò che si trova nel "Dettagli":

****************************************************************************** 
Application does not support just-in-time (JIT) 
debugging. See the end of this message for details. 

************** Exception Text ************** 
System.ArgumentException: Cannot bind to the target method because its signature or security transparency is not compatible with that of the delegate type. 
    at System.Delegate.CreateDelegate(Type type, Object firstArgument, MethodInfo method, Boolean throwOnBindFailure) 
    at System.Delegate.CreateDelegate(Type type, Object firstArgument, MethodInfo method) 
    at Autodesk.AutoCAD.Runtime.CommandClass.InvokeWorker(MethodInfo mi, Object commandObject, Boolean bLispFunction) 
    at Autodesk.AutoCAD.Runtime.CommandClass.InvokeWorkerWithExceptionFilter(MethodInfo mi, Object commandObject, Boolean bLispFunction) 
    at Autodesk.AutoCAD.Runtime.PerDocumentCommandClass.Invoke(MethodInfo mi, Boolean bLispFunction) 
    at Autodesk.AutoCAD.Runtime.CommandClass.CommandThunk.Invoke() 


************** Loaded Assemblies ************** 
mscorlib 
    Assembly Version: 4.0.0.0 
    Win32 Version: 4.0.30319.18444 built by: FX451RTMGDR 
    CodeBase: file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/mscorlib.dll 
---------------------------------------- 
Acdbmgd 
    Assembly Version: 20.0.0.0 
    Win32 Version: 20.0.51.0.0 
    CodeBase: file:///C:/Program%20Files/Autodesk/AutoCAD%202015/AcdbMgd.DLL 
---------------------------------------- 
adui20 
    Assembly Version: 0.0.0.0 
    Win32 Version: 20.0.51.0.0 
    CodeBase: file:///C:/Program%20Files/Autodesk/AutoCAD%202015/adui20.DLL 
---------------------------------------- 
AdUiPalettes 
    Assembly Version: 20.0.0.0 
    Win32 Version: 20.0.51.0.0 
    CodeBase: file:///C:/Program%20Files/Autodesk/AutoCAD%202015/AdUiPalettes.DLL 
---------------------------------------- 
WindowsBase 
    Assembly Version: 4.0.0.0 
    Win32 Version: 4.0.30319.18408 built by: FX451RTMGREL 
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/WindowsBase/v4.0_4.0.0.0__31bf3856ad364e35/WindowsBase.dll 
---------------------------------------- 
System 
    Assembly Version: 4.0.0.0 
    Win32 Version: 4.0.30319.18408 built by: FX451RTMGREL 
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System/v4.0_4.0.0.0__b77a5c561934e089/System.dll 
---------------------------------------- 
PresentationFramework 
    Assembly Version: 4.0.0.0 
    Win32 Version: 4.0.30319.18408 
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/PresentationFramework/v4.0_4.0.0.0__31bf3856ad364e35/PresentationFramework.dll 
---------------------------------------- 
PresentationCore 
    Assembly Version: 4.0.0.0 
    Win32 Version: 4.0.30319.18408 built by: FX451RTMGREL 
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_32/PresentationCore/v4.0_4.0.0.0__31bf3856ad364e35/PresentationCore.dll 
---------------------------------------- 
System.Xaml 
    Assembly Version: 4.0.0.0 
    Win32 Version: 4.0.30319.18408 built by: FX451RTMGREL 
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xaml/v4.0_4.0.0.0__b77a5c561934e089/System.Xaml.dll 
---------------------------------------- 
System.Configuration 
    Assembly Version: 4.0.0.0 
    Win32 Version: 4.0.30319.18408 built by: FX451RTMGREL 
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Configuration/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll 
---------------------------------------- 
System.Xml 
    Assembly Version: 4.0.0.0 
    Win32 Version: 4.0.30319.18408 built by: FX451RTMGREL 
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll 
---------------------------------------- 
AdApplicationFrame 
    Assembly Version: 0.0.0.0 
    Win32 Version: 5.2.8.100 
    CodeBase: file:///C:/Program%20Files/Autodesk/AutoCAD%202015/AdApplicationFrame.DLL 
---------------------------------------- 
AdWindows 
    Assembly Version: 5.2.10.200 
    Win32 Version: 5.2.10.200 
    CodeBase: file:///C:/Program%20Files/Autodesk/AutoCAD%202015/AdWindows.DLL 
---------------------------------------- 
PresentationFramework.Classic 
    Assembly Version: 4.0.0.0 
    Win32 Version: 4.0.30319.18408 built by: FX451RTMGREL 
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/PresentationFramework.classic/v4.0_4.0.0.0__31bf3856ad364e35/PresentationFramework.classic.dll 
---------------------------------------- 
System.Drawing 
    Assembly Version: 4.0.0.0 
    Win32 Version: 4.0.30319.18408 built by: FX451RTMGREL 
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Drawing/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll 
---------------------------------------- 
accoremgd 
    Assembly Version: 20.0.0.0 
    Win32 Version: 20.0.51.0.0 
    CodeBase: file:///C:/Program%20Files/Autodesk/AutoCAD%202015/accoremgd.DLL 
---------------------------------------- 
System.Core 
    Assembly Version: 4.0.0.0 
    Win32 Version: 4.0.30319.18408 built by: FX451RTMGREL 
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Core/v4.0_4.0.0.0__b77a5c561934e089/System.Core.dll 
---------------------------------------- 
Acmgd 
    Assembly Version: 20.0.0.0 
    Win32 Version: 20.0.51.0.0 
    CodeBase: file:///C:/Program%20Files/Autodesk/AutoCAD%202015/Acmgd.DLL 
---------------------------------------- 
AcWindows 
    Assembly Version: 20.0.0.0 
    Win32 Version: 20.0.51.0.0 
    CodeBase: file:///C:/Program%20Files/Autodesk/AutoCAD%202015/AcWindows.DLL 
---------------------------------------- 
AcWindows.resources 
    Assembly Version: 0.0.0.0 
    Win32 Version: 20.0.51.0.0 
    CodeBase: file:///C:/Program%20Files/Autodesk/AutoCAD%202015/en-US/AcWindows.resources.DLL 
---------------------------------------- 
AcCui 
    Assembly Version: 20.0.0.0 
    Win32 Version: 20.0.51.0.0 
    CodeBase: file:///C:/Program%20Files/Autodesk/AutoCAD%202015/AcCui.DLL 
---------------------------------------- 
PresentationFramework-SystemXml 
    Assembly Version: 4.0.0.0 
    Win32 Version: 4.0.30319.18408 
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/PresentationFramework-SystemXml/v4.0_4.0.0.0__b77a5c561934e089/PresentationFramework-SystemXml.dll 
---------------------------------------- 
PresentationFramework.Aero 
    Assembly Version: 4.0.0.0 
    Win32 Version: 4.0.30319.18408 built by: FX451RTMGREL 
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/PresentationFramework.Aero/v4.0_4.0.0.0__31bf3856ad364e35/PresentationFramework.Aero.dll 
---------------------------------------- 
WindowsFormsIntegration 
    Assembly Version: 4.0.0.0 
    Win32 Version: 4.0.30319.18408 built by: FX451RTMGREL 
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/WindowsFormsIntegration/v4.0_4.0.0.0__31bf3856ad364e35/WindowsFormsIntegration.dll 
---------------------------------------- 
System.Windows.Forms 
    Assembly Version: 4.0.0.0 
    Win32 Version: 4.0.30319.18408 built by: FX451RTMGREL 
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms/v4.0_4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll 
---------------------------------------- 
PresentationUI 
    Assembly Version: 4.0.0.0 
    Win32 Version: 4.0.30319.18408 built by: FX451RTMGREL 
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/PresentationUI/v4.0_4.0.0.0__31bf3856ad364e35/PresentationUI.dll 
---------------------------------------- 
System.Xml.Linq 
    Assembly Version: 4.0.0.0 
    Win32 Version: 4.0.30319.18408 built by: FX451RTMGREL 
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml.Linq/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.Linq.dll 
---------------------------------------- 
PresentationFramework-SystemXmlLinq 
    Assembly Version: 4.0.0.0 
    Win32 Version: 4.0.30319.18408 
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/PresentationFramework-SystemXmlLinq/v4.0_4.0.0.0__b77a5c561934e089/PresentationFramework-SystemXmlLinq.dll 
---------------------------------------- 
FeaturedAppsPlugin 
    Assembly Version: 20.0.0.0 
    Win32 Version: 20.0.46.0.0 
    CodeBase: file:///C:/ProgramData/Autodesk/ApplicationPlugins/Autodesk%20FeaturedApps.bundle/Contents/Windows/2015/Win32/FeaturedAppsPlugin.dll 
---------------------------------------- 
UIAutomationTypes 
    Assembly Version: 4.0.0.0 
    Win32 Version: 4.0.30319.18408 built by: FX451RTMGREL 
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/UIAutomationTypes/v4.0_4.0.0.0__31bf3856ad364e35/UIAutomationTypes.dll 
---------------------------------------- 
PresentationFramework-SystemCore 
    Assembly Version: 4.0.0.0 
    Win32 Version: 4.0.30319.18408 
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/PresentationFramework-SystemCore/v4.0_4.0.0.0__b77a5c561934e089/PresentationFramework-SystemCore.dll 
---------------------------------------- 
Anonymously Hosted DynamicMethods Assembly 
    Assembly Version: 0.0.0.0 
    Win32 Version: 4.0.30319.18444 built by: FX451RTMGDR 
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_32/mscorlib/v4.0_4.0.0.0__b77a5c561934e089/mscorlib.dll 
---------------------------------------- 
AcLayer 
    Assembly Version: 20.0.0.0 
    Win32 Version: 20.0.51.0.0 
    CodeBase: file:///C:/Program%20Files/Autodesk/AutoCAD%202015/AcLayer.DLL 
---------------------------------------- 
AcLayer.resources 
    Assembly Version: 0.0.0.0 
    Win32 Version: 20.0.51.0.0 
    CodeBase: file:///C:/Program%20Files/Autodesk/AutoCAD%202015/en-US/AcLayer.resources.DLL 
---------------------------------------- 
AcAeNet.resources 
    Assembly Version: 0.0.0.0 
    Win32 Version: 20.0.51.0.0 
    CodeBase: file:///C:/Program%20Files/Autodesk/AutoCAD%202015/en-US/AcAeNet.resources.DLL 
---------------------------------------- 
AcCloudRender.resources 
    Assembly Version: 0.0.0.0 
    Win32 Version: 20.0.51.0.0 
    CodeBase: file:///C:/Program%20Files/Autodesk/AutoCAD%202015/en-US/AcCloudRender.resources.DLL 
---------------------------------------- 
AcCustomize.resources 
    Assembly Version: 0.0.0.0 
    Win32 Version: 20.0.51.0.0 
    CodeBase: file:///C:/Program%20Files/Autodesk/AutoCAD%202015/en-US/AcCustomize.resources.DLL 
---------------------------------------- 
AcDxWizard.resources 
    Assembly Version: 0.0.0.0 
    Win32 Version: 20.0.51.0.0 
    CodeBase: file:///C:/Program%20Files/Autodesk/AutoCAD%202015/en-US/AcDxWizard.resources.DLL 
---------------------------------------- 
AcExportLayoutUI.resources 
    Assembly Version: 0.0.0.0 
    Win32 Version: 20.0.51.0.0 
    CodeBase: file:///C:/Program%20Files/Autodesk/AutoCAD%202015/en-US/AcExportLayoutUI.resources.DLL 
---------------------------------------- 
AcInterfere.resources 
    Assembly Version: 0.0.0.0 
    Win32 Version: 20.0.51.0.0 
    CodeBase: file:///C:/Program%20Files/Autodesk/AutoCAD%202015/en-US/AcInterfere.resources.DLL 
---------------------------------------- 
AcLayerTools.resources 
    Assembly Version: 0.0.0.0 
    Win32 Version: 20.0.51.0.0 
    CodeBase: file:///C:/Program%20Files/Autodesk/AutoCAD%202015/en-US/AcLayerTools.resources.DLL 
---------------------------------------- 
AcMrUi.resources 
    Assembly Version: 0.0.0.0 
    Win32 Version: 20.0.51.0.0 
    CodeBase: file:///C:/Program%20Files/Autodesk/AutoCAD%202015/en-US/AcMrUi.resources.DLL 
---------------------------------------- 
AcMultiLineUi.resources 
    Assembly Version: 0.0.0.0 
    Win32 Version: 20.0.51.0.0 
    CodeBase: file:///C:/Program%20Files/Autodesk/AutoCAD%202015/en-US/AcMultiLineUi.resources.DLL 
---------------------------------------- 
AcRecoverAll.resources 
    Assembly Version: 0.0.0.0 
    Win32 Version: 20.0.51.0.0 
    CodeBase: file:///C:/Program%20Files/Autodesk/AutoCAD%202015/en-US/AcRecoverAll.resources.DLL 
---------------------------------------- 
AcScaleList.resources 
    Assembly Version: 0.0.0.0 
    Win32 Version: 20.0.51.0.0 
    CodeBase: file:///C:/Program%20Files/Autodesk/AutoCAD%202015/en-US/AcScaleList.resources.DLL 
---------------------------------------- 
AcUnderlay.resources 
    Assembly Version: 0.0.0.0 
    Win32 Version: 20.0.51.0.0 
    CodeBase: file:///C:/Program%20Files/Autodesk/AutoCAD%202015/en-US/AcUnderlay.resources.DLL 
---------------------------------------- 
AcViewTransitionsUi.resources 
    Assembly Version: 0.0.0.0 
    Win32 Version: 20.0.51.0.0 
    CodeBase: file:///C:/Program%20Files/Autodesk/AutoCAD%202015/en-US/AcViewTransitionsUi.resources.DLL 
---------------------------------------- 
AdskConnectionPointMgd.resources 
    Assembly Version: 0.0.0.0 
    Win32 Version: 20.0.51.0.0 
    CodeBase: file:///C:/Program%20Files/Autodesk/AutoCAD%202015/en-US/AdskConnectionPointMgd.resources.DLL 
---------------------------------------- 
AcCalcUi.resources 
    Assembly Version: 0.0.0.0 
    Win32 Version: 20.0.51.0.0 
    CodeBase: file:///C:/Program%20Files/Autodesk/AutoCAD%202015/en-US/AcCalcUi.resources.DLL 
---------------------------------------- 
AcLivePreviewContext 
    Assembly Version: 0.0.0.0 
    Win32 Version: 20.0.51.0.0 
    CodeBase: file:///C:/Program%20Files/Autodesk/AutoCAD%202015/AcWindows.dll 
---------------------------------------- 
AcDialogToolTips 
    Assembly Version: 20.0.0.0 
    Win32 Version: 20.0.51.0.0 
    CodeBase: file:///C:/Program%20Files/Autodesk/AutoCAD%202015/AcDialogToolTips.DLL 
---------------------------------------- 
AcDialogToolTips.resources 
    Assembly Version: 0.0.0.0 
    Win32 Version: 20.0.51.0.0 
    CodeBase: file:///C:/Program%20Files/Autodesk/AutoCAD%202015/en-US/AcDialogToolTips.resources.DLL 
---------------------------------------- 
Write To Block 
    Assembly Version: 1.0.5276.26438 
    Win32 Version: 1.0.0.0 
    CodeBase: file:///C:/Users/Administrator/Documents/Clearspan/AutoCAD%20Projects/Write%20To%20Block/Write%20To%20Block/bin/Debug/Write%20To%20Block.dll 
---------------------------------------- 

************** JIT Debugging ************** 
Application does not support Windows Forms just-in-time (JIT) 
debugging. Contact the application author for more 
information. 
+0

Si prega di fare clic sul pulsante dettagli prima e incollare i dettagli al post. Mi chiedo perché questa domanda ottenga 5 upvotes ..... – Matt

+0

Quale versione/bitness di AutoCAD è questa? –

+0

Questo è AutoCAD 2015 su un computer Windows 7 a 32 bit –

risposta

1

System.ArgumentException: non può legarsi al metodo di destinazione, perché la sua trasparenza sicurezza firma o non è compatibile con quello del tipo delegato.

La mia comprensione è che il metodo "GetObjectData" dell'interfaccia è in conflitto con quello ISerializable, da qualche parte nella cucina di BinnaryFormatter.

Proprio rifattorizziamo tutta la funzione di conversione (StreamToResBuf, ResBufToStream ...) nella vostra myutil e si dovrebbe essere in grado di serializzare/deserializzare qualsiasi classe contrassegnati con l'attributo [Serializable].
La classe manichino dovrebbe essere così (raccolta e tipi primitivi sono auto-serializzati, implementare ISerializable solo quando necessario):

[Serializable] 
public class MattMember 
{ 
    public string Name; 
    List<int> MattsInts; 
} 

Il metodo NewFromEntity (evitare il getto inutile qui):

public object NewFromEntity(Entity ent) 
     {  
      using (ResultBuffer resBuf = ent.GetXDataForApplication("Member")) 
      { 
       BinaryFormatter bf = new BinaryFormatter(); 

       bf.Binder = new MyBinder(); 

       MemoryStream ms = this.ResBufToStream(resBuf); 
       return bf.Deserialize(ms); 
      }  
     } 

e, infine, il vostro comando:

[CommandMethod("GetClassFromEntityXData", CommandFlags.Modal)] 
//Updated return type here but don't know if it is correct with AutoCAD 
public object GetClassFromEntityXData() 
{ 
    Database db = Application.DocumentManager.MdiActiveDocument.Database; 
    Editor ed = Application.DocumentManager.MdiActiveDocument.Editor; 
    object objectToRestore; 

    MyUtil util = new MyUtil(); 

    PromptEntityResult per = ed.GetEntity("Select entity to get class from:\n"); 

    if (per.Status != PromptStatus.OK) 
     return; 

    // Get back the class 
    using (Transaction tr = db.TransactionManager.StartTransaction()) 
    { 
     Entity ent = (Entity)tr.GetObject(per.ObjectId, OpenMode.ForRead); 
     //Cast to your IClearspan interface here, or use Reflection 
     // to determine deserialized object's Type 
     objectToRestore = util.NewFromEntity(ent); 

     tr.Commit(); 
    } 

    return objectToRestore; 
} 
0

sparo nel buio: è necessario sia un costruttore di default dal momento che qualcun altro constucts vostro oggetto:

public MattMember() 
{ 

} 

o un costruttore di deseralizzazione speciale come questo:

protected MattMember(SerializationInfo info, StreamingContext context) 
    { 
// Set object data  
    } 

Probabilmente la tua interfaccia deve anche eredita da ISerializable

+0

Grazie, ma ho provato anche tutto questo –

1
at System.Delegate.CreateDelegate(Type type, Object firstArgument, MethodInfo method, Boolean throwOnBindFailure) 
    at System.Delegate.CreateDelegate(Type type, Object firstArgument, MethodInfo method) 
    at Autodesk.AutoCAD.Runtime.CommandClass.InvokeWorker(MethodInfo mi, Object commandObject, Boolean bLispFunction) 

È importante interpretare correttamente la traccia dello stack. Nessuno del codice che hai postato è coinvolto, non è mai iniziato. Questo fallì quando AutoCAD ha provato a chiamare il tuo gestore di comando:

[CommandMethod("GetClassFromEntityXData", CommandFlags.Modal)] 
public void GetClassFromEntityXData(IClearspanSerializable objectToRestore) 
// etc.. 

AutoCAD non sta per darvi che objectToRestore argomento, non conosce i fagioli circa l'interfaccia. Qual è il significato dell'eccezione, non può associare un delegato a un metodo con un argomento misterioso. Nota come il codice di esempio che hai iniziato usa un metodo senza argomenti. E come ha usato Editor.GetEntity() per consentire all'utente di scegliere un'entità di disegno. Presumo che tu abbia bisogno di uno schema simile, non ne so abbastanza degli script di AutoCAD.

0
[CommandMethod("SaveClassToEntityXData", CommandFlags.Modal)] 
public void SaveClassToEntityXData(IClearspanSerializable objectToSerialize) 

La funzione che implementa il comando non può accettare parametri, ma all'interno dell'implementazione del comando è possibile accettare parametri utilizzando funzioni di input dalla riga di comando come GetString(), GetInteger(), ecc. Che è possibile trovare nella classe Editor.

Da http://adndevblog.typepad.com/autocad/2012/07/create-command-with-parameters.html

Problemi correlati