Я запускаю свой код в Visual Studio 2019 и AutoCAD 2016. Я написал несколько простых функций, которые работали нормально. И теперь я попытался написать плагин, который создает ссылку на блок для каждого MTEXT с одинаковыми координатами. Когда я вызываю свою новую команду, я получаю все ожидаемые диалоговые оповещения от своей команды, но после этого AutoCAD закрывается, и я вижу следующую ошибку в выходе Visual Studio: целевой процесс завершился, не вызвав событие запуска CoreCLR. Убедитесь, что целевой процесс настроен на использование. NET Core. Этого можно ожидать, если целевой процесс не запущен. NET Core. Программа '[21236] acad.exe' завершила работу с кодом -1073741571 (0xc00000fd) «Переполнение стека».
Исходный код моей команды:
[CommandMethod("blockTest")]
static public void blockTest()
{
string attbName = "HEIGHT";
// Get the current docusment and database, and start a transaction
Document acDoc = Application.DocumentManager.MdiActiveDocument;
Database acCurDb = acDoc.Database;
Editor acDocEd = Application.DocumentManager.MdiActiveDocument.Editor;
using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
{
BlockTable bt = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead) as BlockTable;
BlockTableRecord btr = acTrans.GetObject(acCurDb.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord;
btr.UpgradeOpen();
foreach (ObjectId objId in btr)
{
if (objId.ObjectClass.DxfName == "MTEXT")
{
MText mtext = acTrans.GetObject(objId, OpenMode.ForRead, true) as MText;
Point3d mtextCoord = mtext.Location;
//create br for mtext
br br = new br(new Point3d(mtextCoord.X, mtextCoord.Y, mtextCoord.Z), btr.Id);
//update HEIGHT attribute in block reference to be same as mtext text
foreach (ObjectId arId in br.AttributeCollection)
{
AttributeReference ar = acTrans.GetObject(arId, OpenMode.ForRead) as AttributeReference;
if (null == ar)
{
Application.ShowAlertDialog("AttributeReference getting failed!");
return;
}
if (ar.Tag.ToUpper() == attbName)
{
ar.UpgradeOpen();
ar.TextString = mtext.Contents.ToString();
ar.DowngradeOpen();
}
}
br.SetDatabaseDefaults();
Application.ShowAlertDialog("before AppendEntity!");
btr.AppendEntity(br);
acTrans.AddNewlyCreatedDBObject(br, true);
Application.ShowAlertDialog("after AppendEntity!");
}
}
acTrans.Commit();
}
}
Я запускал код в образце Файл AutoCAD, который содержит только 2 MTEXT. Если я закомментирую строки, которые используют API-интерфейсы AppendEntity и AddNewlyCreatedDBObject, AutoCAD не закроется сам. Я не понимаю, как я могу получить переполнение стека. Пожалуйста, помогите.