5

Próbuję utworzyć kod, który może serializować i deserializować bibliotekę Klasy w rysunku programu AutoCAD. To pytanie ma niewiele wspólnego z programem AutoCAD, ponieważ jest to powód, dla którego nie mogę go debugować w normalny sposób. Zacząłem ten projekt od this article i udało mi się uruchomić jego kod. Jednak sposób w jaki zbudowany jest jego kod, wymagałby ode mnie, aby wszystkie moje klasy dziedziczyły z jego podstawowego obiektu. Ponieważ wyraźnie jest to zapach kodu, wiedziałem, że muszę zamiast tego stworzyć interfejs. Poniżej znajduje się kod, który zakończyłem.Kod Serializacji Powoduje Nieobsługiwany Wyjątek

Pierwsza sekcja to kod odpowiedzialny za wykonanie serializacji w rysunku programu AutoCAD.

Druga sekcja jest przykładem klasy, która implementuje mój własny interfejs serializacji

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(); 

     } 

    } 
} 

Oto obojętne klasy I 'm próby przetestować z:

[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; 
    } 
} 

i tutaj jest interfejs :

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

Kiedy próbuję uruchomić kod w programie AutoCAD, wszystko co otrzymuję to błąd lub. Co prowadzi mnie do przekonania, że ​​istnieje prosty błąd w mojej inicjalizacji moich zajęć. Brak moich punktów przerwania zostaje trafiony.

Unhandled Exception

Jak debugować to? i gdzie skręciłem moją inicjalizację?

[EDIT] -Tutaj jest to, co jest w "Szczegóły":

****************************************************************************** 
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

proszę kliknąć przycisk Szczegóły pierwszy i wkleić szczegółów do postu. Zastanawiam się, dlaczego to pytanie dostaje 5 przegranych ... – Matt

+0

Jaka jest wersja/bitness AutoCAD? –

+0

To jest AutoCAD 2015 na 32-bitowej maszynie z Windows 7 –

Odpowiedz

1

System.ArgumentException: Nie można powiązać z metodą docelowej, ponieważ jego przejrzystość bezpieczeństwo podpis lub nie jest zgodny z tym z rodzaju delegata.

Rozumiem, że metoda "GetObjectData" w interfejsie jest w konflikcie z kodem ISerializowalnym, gdzieś w kuchni BinnaryFormatter.

Po prostu przekształć wszystkie funkcje konwersji (StreamToResBuf, ResBufToStream ...) w MyUtil i powinieneś być w stanie serializować/deserializować dowolną klasę oznaczoną przy użyciu atrybutu [Serializable].
Twój manekin klasa powinna wyglądać następująco (zbieranie i prymitywne typy są automatycznie odcinkach, wdrożyć ISerializable tylko w razie potrzeby):

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

Metoda NewFromEntity (unikać niepotrzebnego obsady tutaj):

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); 
      }  
     } 

i wreszcie swoją komendę:

[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

Strzał w ciemności: Trzeba albo domyślnego konstruktora, ponieważ ktoś inny konstruktów dla nadania swój obiekt:

public MattMember() 
{ 

} 

lub specjalny konstruktor dezyserów, taki jak ten:

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

Prawdopodobnie twój interfejs również potrzebuje dziedziczy po ISerializable

+0

Dzięki, ale próbowałem tego wszystkiego –

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) 

Ważne jest, aby poprawnie interpretować ślad stosu. Żaden z opublikowanych przez Ciebie kodów nie jest w to zaangażowany, nigdy się nie rozpoczął. To nie powiodło się podczas AutoCAD próbował zadzwonić do obsługi poleceń:

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

AutoCAD nie jest zamiar dać wam, że objectToRestore argumentem, że nie wie, fasolę o interfejsie. Co oznacza ten wyjątek, nie może powiązać delegata z metodą z tajemniczym argumentem. Zwróć uwagę, że przykładowy kod, z którego zacząłeś, używa metody bez argumentów. I w jaki sposób użył Editor.GetEntity(), aby umożliwić użytkownikowi wybór jednostki rysunku. Zakładam, że potrzebujesz podobnego schematu, nie wiem wystarczająco dużo o skryptach AutoCAD.

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

Funkcja implementująca polecenie nie może przyjmować parametrów, ale w implementacji polecenia można przyjmować parametry za pomocą funkcji wprowadzania danych z linii komend, takich jak GetString(), GetInteger() itp., Które można znaleźć w klasie edytora.

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

Powiązane problemy