Autocad .Net 集成 - 从 Excel 调用简单函数时成功编译 DLL 错误

Autocad .Net integration - successfully compiled DLL errors on calling a simple function from Excel

我正在处理一个需要在 Excel 中集成 Autocad 的项目。我编译了一个 DLL,并在 Excel 中成功引用,但调用简单函数失败。

COM接口没有问题;该项目勾选了这些,我可以从 excel 成功调用一个简单的 "hello world" 测试函数。我在 C# 项目中也有所有正确的引用。多余的参考文献是以后工作所需要的。

此行函数失败:

var acDocMgr = Autodesk.AutoCAD.ApplicationServices.Core.Application.DocumentManager;

无论是否打开 Autocad 应用程序,如果失败。

请帮忙。

using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Linq;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Runtime;
using CadApp = Autodesk.AutoCAD.ApplicationServices.Application;
using Autodesk.AutoCAD.ApplicationServices;

[assembly: CommandClass(typeof(AutocadHandler.MyCommands))]

namespace AutocadHandler
{
    [ClassInterface(ClassInterfaceType.AutoDual)]


    public class MyCommands
    {

        public static void TestFunction()
        {                       
            string strFileName = "C:\Users\CORE I7\Documents\Drawing2XLS.dwg";
            var acDocMgr = Autodesk.AutoCAD.ApplicationServices.Core.Application.DocumentManager;
            acDocMgr.Open(strFileName, false);
            acDocMgr.MdiActiveDocument.Editor.WriteMessage("Hello Excel");
        }

    }

}

错误Excelreturns是:

Run-time error '-2146233036 (80131534)': Automation error

您是否试图从 Excel 中 运行 您的代码,并试图让 Excel 打开 AutoCAD 来操作绘图?我认为那行不通。您可以采取另一种方式,打开 AutoCAD,加载插件,然后通过 API 将 AutoCAD 中的信息提供给 Excel。 AutoCAD API 需要 AutoCAD 运行ning(或 ACCORECONSOLE,它是 AutoCAD 的命令行版本,但需要一些额外的管道)才能对图形文件执行任何操作。如果是 AutoCAD,而不是 ACCORECONSOLE,您通常至少需要打开一张图纸(..DocumentManager.MdiActiveDocument)。然后,您可以使用文档管理器打开其他文档,前提是您有权这样做。

    /// <summary>
    /// Look through the Application's Document manager for a Document object with the given name.  If found return it,
    /// else open the drawing/Document and return it.
    /// </summary>
    /// <param name="name">The name to look for in the collection</param>
    /// <returns>An AutoCAD Document object.</returns>
    public static ACADApp.Document GetDocumentByName(string name)
    {
        try
        {
            foreach (ACADApp.Document doc in ACADApp.Application.DocumentManager)
            {
                if (doc.Database.Filename.ToUpper() == name.ToUpper() || doc.Name.ToUpper() == name.ToUpper())
                {
                    return doc;
                }
            }
            return ACADApp.Application.DocumentManager.Open(name);

        }
        catch (System.Exception ex)
        {
            TBExceptionManager.HandleException(name, ex);
            return null;
        }
    }