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.
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.
Si prega di fare clic sul pulsante dettagli prima e incollare i dettagli al post. Mi chiedo perché questa domanda ottenga 5 upvotes ..... – Matt
Quale versione/bitness di AutoCAD è questa? –
Questo è AutoCAD 2015 su un computer Windows 7 a 32 bit –