c# - 如何通过 C# 外部应用程序访问 AutoCAD 应用程序的特定实例

标签 c# com autocad

我正在尝试通过 AutoCAD 2007 与 C# 外部应用程序的 COM 接口(interface)获取有关所有正在运行的 AutoCAD 2007 实例的信息(列出打开文档的全名)。这是一个代码:

…
using AutoCAD = Autodesk.AutoCAD.Interop;
using System.Runtime.InteropServices.ComTypes;
…
[DllImport("ole32.dll")]
extern static IntPtr CreateBindCtx(IntPtr reserved, out IBindCtx ppbc);
…
static void ListACADDocs()
{
    IntPtr HRESULT;
    IBindCtx objCtx = null;

    HRESULT = CreateBindCtx(new IntPtr(0), out objCtx);

    IRunningObjectTable objRot = null;
    objCtx.GetRunningObjectTable(out objRot);

    IEnumMoniker RunningMonikers = null;
    objRot.EnumRunning(out RunningMonikers);

    RunningMonikers.Reset();

    IntPtr pointerFetchedMonikers = IntPtr.Zero;
    IMoniker[] monikerContainer = new IMoniker[1];
    String strDisplayName;

    Object COMObject = null;
    List<Object> colACADInstances = new List<Object>();

    while (RunningMonikers.Next(1, monikerContainer, pointerFetchedMonikers) == 0)
    {
        monikerContainer[0].GetDisplayName(objCtx, null, out strDisplayName);
        objRot.GetObject(monikerContainer[0], out COMObject);

        //AutoCAD.Application.17 class ID: {28B7AA99-C0F9-4C47-995E-8A8D729603A1}

        if (strDisplayName == "!{28B7AA99-C0F9-4C47-995E-8A8D729603A1}")
            colACADInstances.Add(COMObject);
    }

    foreach (Object obj in colACADInstances)
        foreach(AutoCAD.AcadDocument doc in
            ((AutoCAD.AcadApplication)obj).Documents)
            Console.WriteLine(doc.FullName);
}

结果,它找到与所有 ACAD 运行实例相对应的正确数量的名字,但仅从“最早”实例中检索文档名称。看起来所有绰号都引用单个 AutoCAD.AcadApplication 对象。有没有办法对每个实例都做到这一点?

最佳答案

无论如何,AutoCAD 仅在运行对象表中注册一次,因此沿着这条路走下去将一事无成。几年前,我也曾经历过同样的情况,甚至还与基恩·沃尔姆斯利(Kean Walmsley)就此展开了讨论。他向我介绍了一种技术,该技术需要从 VBA 的每个 AutoCAD session 内部运行对自定义服务的伪注册,然后让您的 .NET 应用程序查看该自定义注册。马虎?确实。然而,如果您确实需要让它发挥作用,这个概念是合理的。

关于c# - 如何通过 C# 外部应用程序访问 AutoCAD 应用程序的特定实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17855665/

相关文章:

c# - Entity Framework 代码优先 : Configuration. cs 种子或自定义初始值设定项

c# - 用于比较值类型的短路运算符的.Net 性能?

c# - 无法下载 Office 365 SharePoint 库项目

c# - 如何从 c# 返回列表并通过 com 在 vc++ 中使用它

.net - VB.Net - Excel COM 对象未发布

c# - 同时选中DataGridView中的所有复选框

winapi - 我需要在哪里切换激活上下文?

c# - AutoCAD eNotOpenForWrite

python - 使用 Python 保存 AutoCAD 文件 (.dwg)

c# - 绘制带网格的实心框