我正在使用 Visual Studio 2013 在 AutoCAD 2014 中工作。
使用我的代码,我从 DocumentManager 访问 MdiActiveDocument 的数据库。
使用数据库我启动一个事务并使用事务的 GetObject 方法来检索实体对象。
Database acCurDb = Application.DocumentManager.MdiActiveDocument.Database;
using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
{
var obj = acTrans.GetObject(id, OpenMode.ForRead);
if (obj is Entity)
{
// do stuff
}
acTrans.Commit();
}
当我在开发并从 Visual Studio 内部启动 AutoCAD 时,这工作正常。在开发中,我在应用程序属性的“调试”选项卡中设置了“启动外部程序”开关,因此它为我启动了 AutoCAD,一切正常。
我遇到的问题是,在生产中,当 AutoCAD 通过注册表设置(我使用按需加载)加载应用程序时,MdiActiveDocument 为空,因此代码崩溃。我发现 Application.DocumentManager 中有一个文档,但是当我将该文档中的数据库分配给 acCurDb 时,TransactionManager 会抛出一个错误,我尝试使用 StartTransaction 方法。
if (Application.DocumentManager.Count > 0)
{
foreach(Document doc in Application.DocumentManager)
{
acCurDb = doc.Database;
break;
}
}
using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
{
}
有人可以帮助我理解为什么 MdiActiveDocument 为空和/或指导我在 AutoCAD 中获取 Transaction 对象的正确方法吗?