利用C#进行AutoCAD的二次开发(二)

原创 2003年12月23日 15:28:00

利用C#进行AutoCAD的二次开发(二)<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

C#才鸟

       大家好,今天我继续给各位介绍利用C#进行AutoCAD的二次开发。在这一讲中,主要介绍上一讲例子中存在的问题。

         在上一次的例子中我是通过引用AutoCAD 2004 Type Library来进行C#AutoCAD之间的通信,但这种方法存在两个致命的缺点。第一个缺点是每次调试程序的时候C#都要重新启动AutoCAD,如果调试的次数非常多(比如跟踪错误然后调试),那么编程的效率就很低,因为启动一次CAD还是需要较长的时间。相对于第一个缺点,第二个缺点则更要命。由于.NET本身的问题,Interop.AutoCAD.dll文件(就是通过它才实现了C#AutoCAD之间的通信)存在着一些bug,因此虽然有时你的代码是完全正确的,但C#编译器还是抛出莫名其妙的错误。那不是完蛋了吗?我曾经有一阶段就因为这两个要命的东东差一点放弃了C#而想改学ObjectArx了,呵呵,不过还是运气好,我偶尔一次在网上看了一篇外国人写的文章,他专门介绍了这两个问题的解决办法。下面就来解决这两个问题。

         首先来看第二个难题,按以下步骤来进行:

1.        随便用Visual Studio .NET建立一个C#应用程序,然后按照上一篇文章中的设置加入AutoCAD 2004 Type Library,然后不加入任何代码,编译你的程序。

2.        Visual Studio .NET命令行工具下用ildasm.exe(这个工具可以在Visual Studio .NET安装光盘中找到)把Interop.AutoCAD.dll文件(这个文件在步骤1中生成的项目的Bin/Release文件夹中)编译成中间语言Interop. AutoCAD.il。注意:在步骤1中建立的项目的编译设置为Release模式。

    ildasm.exe /source Interop.AutoCAD.dll /output=Interop. AutoCAD.il

    又要注意了:把ildasm.exeInterop.AutoCAD.dll放在同一目录下。

3.在记事本中打开Interop. AutoCAD.il文件,然后查找结尾是“SinkHelper”而开头为 ".class private auto ansi sealed _DAcad“的语句,把语句中的private 改为public,然后保存Interop. AutoCAD.il文件。

4.使用ilasm.exeInterop. AutoCAD.il文件编译为Interop.AutoCAD.dll文件,同样是在Visual Studio .NET命令行工具下进行。

    ilasm.exe  /resource=Interop.AutoCAD.res /dll Interop.AutoCAD.il /output=Interop. AutoCAD.dll

 Interop.AutoCAD.res文件是在步骤1中生成的。

5.显然你不愿意每次编写应用程序时都通过上一篇文章中介绍的方法来加入Interop. AutoCAD.dll,那太麻烦了。你可以用下面的方法来让程序自动加入该文件:找到C:/Program Files/Microsoft.NET/ Primary Interop Assemblies 文件夹,然后把上面生成的

Interop.AutoCAD.dll文件拷贝进去。     

       好了,第二个问题解决了,接下来看第一个。

       VBA中,编程者可以使用GetObject函数来获得当前活动的AutoCAD对象,但在C#中却没有,为了这个函数我几乎把MSDN给翻遍了,然后去各种C#论坛问各位高手,结果都没得到解决,呵呵,可能国内使用C#的人比较少吧。还是在老外的论坛上看到了一篇就是讲这个问题的文章才把这个难题给解决了。使用下面的语句就可以获得当前活动的AutoCAD对象了:

   (AcadApplication)Marshal.GetActiveObject("AutoCAD.Application.16")

     (对于CAD2000CAD2002,则把16改为15)

当然以上语句必须在AutoCAD打开的情况下才能使用,否则会发生错误,对于AutoCAD没打开的情况,可以使用上一篇文章的方法来处理。完整的连接AutoCADC#的源程序如下所示:

using System;

using AutoCAD;

using System.Runtime.InteropServices;

namespace AcadExample

{

   public class AutoCADConnector : IDisposable

   {

      private AcadApplication _application;

      private bool _initialized;

      private bool _disposed;

      public AutoCADConnector()

      {

         try

         {

            // Upon creation, attempt to retrieve running instance

            _application = (AcadApplication)Marshal.GetActiveObject("AutoCAD.Application.16");

         }

         catch

         {

            try

            {

               // Create an instance and set flag to indicate this

               _application =  new AcadApplicationClass();

               _initialized = true;

            }

            catch

            {

               throw;

            }

         }

      }

      // If the user doesn't call Dispose, the

      // garbage collector will upon destruction

      ~AutoCADConnector()

      {

         Dispose(false);

      }

 

      public AcadApplication Application

      {

         get

         {

            // Return our internal instance of AutoCAD

            return _application;

         }

      }

             

      // This is the user-callable version of Dispose.

      // It calls our internal version and removes the

      // object from the garbage collector's queue.

      public void Dispose()

      {

         Dispose(true);

         GC.SuppressFinalize(this);

      }

 

      // This version of Dispose gets called by our

      // destructor.

      protected virtual void Dispose(bool disposing)

      {

         // If we created our AutoCAD instance, call its

         // Quit method to avoid leaking memory.

         if(!this._disposed && _initialized)

            _application.Quit();

            

         _disposed = true;        

      }

   }

}

利用Visual Studio.net 把上面的程序编译成一个类库,你就可以在以后的程序中使用它了,下面的这个例子说明了它的用法。(首先把AcadExample类库包含在项目中)

using System;

using AcadExample;

using AutoCAD;

namespace ConsoleApplication6

{

   class Class1

   {

      [STAThread]

      static void <?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />Main(string[] args)

      {

         using (AutoCADConnector connector = new AutoCADConnector())

         {

            Console.WriteLine(connector.Application.ActiveDocument.Name);

         }

         Console.ReadLine();

      }

   }

}

这个例子是在C#窗口中显示AutoCAD中当前文档的标题。

c#对AutoCAD二次开发

对AutoCAD进行二次开发可以使用:ObjectArx,VBA,VLisp。但在这里不借用它们,而是直接使用C#开发。 有类库和应用程序两种方式:   方法1:vs2010 开发A...
  • yiyihuazi
  • yiyihuazi
  • 2017年04月18日 11:24
  • 2640

利用C#进行AutoCAD的二次开发

利用C#进行AutoCAD的二次开发(一) 呵呵,把自己前在网上以表的文章放到这里。 利用C#进行AutoCAD的二次开发(一)            众所周知,对AutoCAD进行二次开发用到的主要...
  • yuanqingfei
  • yuanqingfei
  • 2004年07月05日 18:39
  • 3686

AutoCAD二次开发——AutoCAD.NET API开发环境搭建

通过这篇文章,终于实现了第一个基于C#和autocad2010开发第一个小程序 AutoCAD二次开发——AutoCAD.NET API开发环境搭建 AutoCAD二次开发工具:1986年Auto...
  • hailiannanhai
  • hailiannanhai
  • 2016年08月18日 16:43
  • 4774

C#.NET平台的AutoCAD二次开发

本文基于AutoCAD 2006新推出的.NET API为工具,介绍了在.NET平台下对AutoCAD进行二次开发的技术,并与目前常用的VBA、ObjectARX作了对比。同时讨论了如何弥补.NET ...
  • phqm
  • phqm
  • 2008年11月08日 11:45
  • 5988

autocad二次开发资料总结

autocad二次开发 AutoCAD(Auto Computer Aided Design)是美国Autodesk公司研制开发的一款计算机辅助设计软件,它不是一款简单的绘图工具,而是一个复...
  • bcbobo21cn
  • bcbobo21cn
  • 2015年11月23日 21:45
  • 2983

AUTOCAD二次开发-----删除一个图层里面的所有对象

private void Test() { // 获取当前文档和数据库 Document acDoc = Application.Doc...
  • aasswwe
  • aasswwe
  • 2014年11月07日 21:37
  • 2561

利用C#进行AutoCAD的二次开发(三)

                        利用C#进行AutoCAD的二次开发(三)                                    C#才鸟   这一讲的主要内容是介绍A...
  • zhf7878
  • zhf7878
  • 2004年01月05日 11:53
  • 2103

C#进行AutoCAD二次开发实例之倒角功能实现原理介绍

内容提要:         今天又是周五,到了双休的日子,比较兴奋,看了一晚上的《最强大脑》,顿时赶脚智商成了硬伤。。。刚才躺下打算睡觉,觉得还是应该写写CAD二次开发的相关一些内容,原因是最近搜网上...
  • itxiaohei323
  • itxiaohei323
  • 2016年02月27日 02:11
  • 2562

AutoCAD二次开发之.net API学习笔记

1、用户交互
  • liupeng_qwert
  • liupeng_qwert
  • 2015年05月07日 10:07
  • 474

利用C#进行AutoCAD的二次开发(二) by C#才鸟

 大家好,今天我继续给各位介绍利用C#进行AutoCAD的二次开发。在这一讲中,主要介绍上一讲例子中存在的问题。 在上一次的例子中我是通过引用AutoCAD 2004 Type Library来进行C...
  • leercwx
  • leercwx
  • 2008年08月07日 12:23
  • 341
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:利用C#进行AutoCAD的二次开发(二)
举报原因:
原因补充:

(最多只允许输入30个字)