【问题标题】:C# Cannot Bind to Target MethodC# 无法绑定到目标方法
【发布时间】:2018-04-02 22:05:25
【问题描述】:

我正在努力将 C# 对象序列化为 AutoCAD 实体。我有一个序列化它们的方法,我试图从 AutoCAD 命令行调用这个方法来反序列化它们。

            [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,您在发布此列表时是否在using (Transaction tr = db.TransactionManager.StartTransaction()) 之后缺少{
  • 不,C# 语法允许您堆叠 using 语句,然后为所有语句使用一组 {}
  • 整洁。 如何运行?它是 AutoCAD 的插件吗?如果是这样,请尝试将 Visual Studio 附加到它之前或从 Visual Studio 中的项目,将调试 Startup 设置为 AutoCAD 并对其进行调试。这将 VS 将首先加载您的 dll(我假设它是一个 .dll)并在启动 AC 之前调试信息。如果您正在启动一些 AC 命令行工具,同样适用?
  • 那也行不通,该方法甚至从未真正启动

标签: c# autocad autocad-plugin


【解决方案1】:

想通了,方法必须是void,否则它会发疯并抛出这个错误。

【讨论】:

    【解决方案2】:

    理想的命令方法是:

    public static void MethodName()
    

    这里的静态会使AutoCAD不实例化类来调用命令。另外,应该是void,不接受任何参数

    如果您不 Commit() 事务,AutoCAD 将假定 Abort(),因此您可能需要在例程结束时调用它。

    【讨论】:

      猜你喜欢
      • 2021-05-15
      • 1970-01-01
      • 2013-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多