Я работаю над возможностью сериализации объектов 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;
}
Однако, когда я называю его, я поздоровался с этой ошибкой и понятия не имею, почему, как это не дает номера строк или полезную информацию для отладки.
hmmm, вы не используете '{' after' using (Transaction tr = db.TransactionManager.StartTransaction()) 'при публикации этого объявления? – MickyD
Нет, синтаксис C# позволяет вам складывать с помощью операторов, а затем иметь один набор {} для всех из них –
Neat. _How_ этот прогон? Это плагин для AutoCAD? Если это так, попробуйте добавить Visual Studio к нему или из вашего проекта в Visual Studio, установите Debug ** Startup ** в AutoCAD и отлаживайте его. Это будет VS будет загружать вашу dll сначала (я предполагаю, что это DLL) и отладочную информацию до запуска AC. То же самое относится, если вы запускаете какой-нибудь инструмент командной строки AC, возможно? – MickyD