程序员通常要么整合功能到AutoCAD(利用其Plug-in结构,以增加命令,用户界面,对象等),或者调用它自动完成任务。显然,这两者之间的界限已经比较模糊,但是今天我们重点介绍第二类。

用于帮助理解后面的说明,我想介绍两种类型的应用程序交互。

Out-of-process

在这种情况下,我们有两个独立的程序试图交互。试想你有一个EXE和你想调用的AutoCAD。你需要某种方式来启动它,并却与它通讯,
通常可是使用COM,之前是DDE。通讯按照定义来说是由跨进程间通信( Inter-Process Communication (IPC)),IPC对于发送大量数据显得效率十分低下。这时就为什么原来的ADS和外部VB程序运行十分缓慢的原因。

In-process

当你的代码打包为DLL(无论是VB6的ActiveX DLL还是ObjectARX模块,或者.NET封装的DLL),他和主进程(AutoCAD)的通讯与IPC相比就要快捷的多,数据可以通过指针和引用进行传递。

目前大部分AutoCAD的API都是为in-process设计的。包括LISP,ObjectARX和AutoCAD的.NET API。许多人希望AutoCAD可以通过.NET Remoting在out-of-pocess模式下被调用,但这并不是托管API的初衷:它实际上被封装在使用指针调用和存取Objects的ObjectARX之上,而且它并不是跨越进程界限的处理工作。COM的一个很好的特点是,它既可以工作于out-of-process模式(外部EXE),也可以在in-process(VBA,或者通过调用GetInterfaceObject()来装载一个VB6 ActiveX DLL)。这是一个从外部应用程序调用AutoCAD的最好的办法。

我通常不推荐越过进程边界传递太多的信息。如果你需要从一个外部应用程序中调用AutoCAD,启动它(或者连接到它的一个正在运行的实例),然后在AutoCAD进程内部加载一个in-process模块处理大量的信息。

下面的代码说明了怎么做到上面的方法。它连接到一个正在运行的AutoCAD实例(可选,你可以调整代码直接启动AutoCAD),如果失败,再启动AutoCAD。一旦有一个正在运行的实例,我们使之可见,并且运行一个自定义的命令。

你需要在你的应用程序中添加"AutoCAD Type Library"引用

This C# code can be added to an “on-click” event handler for a button (for example) or another function that makes sense in the context of your application.

using System;
     using System.Runtime.InteropServices;
     using Autodesk.AutoCAD.Interop;
  // "AutoCAD.Application.17" uses 2007 or 2008,
  //  whichever was most recently run

// "AutoCAD.Application.17.1" uses 2008, specifically

const string progID = "AutoCAD.Application.17.1";

AcadApplication acApp = null;
  try
  {
    acApp =
      (AcadApplication)Marshal.GetActiveObject(progID);
  }
  catch
  {
    try
    {
      Type acType =
        Type.GetTypeFromProgID(progID);

acApp =
        (AcadApplication)Activator.CreateInstance(
          acType,
          true
        );
    }
    catch
    {
      MessageBox.Show(
        "Cannot create object of type /"" +
        progID + "/""
      );
    }
  }

if (acApp != null)
  {
    // By the time this is reached AutoCAD is fully
    // functional and can be interacted with through code

acApp.Visible = true;
    acApp.ActiveDocument.SendCommand("_MYCOMMAND ");
  }

[翻译]Kean' Blog 在一个.NET应用程序中调用AutoCAD相关推荐

  1. [翻译]Kean' Blog 在一个.NET应用程序中调用AutoCAD(续)

    这篇文章应该算是上篇文章的续,跟上个一样,不过是利用System.Diagnostics命名空间的类,实现启动CAD时候+上参数. 直接贴代码了,,呵呵~ using System; using Sy ...

  2. SQL Server 2005 - 如何在预存程序中调用另外一个预存程序

    要在一个预存程序中调用另外一个预存程序,可以使用下列两种方式之一进行调用:  <?xml:namespace prefix = o /> EXECUTE <欲执行之预存程序的名称&g ...

  3. 本地方法(JNI)——从java 程序中调用C函数

    [0]README 1) 本文部分文字描述 转自 core java volume 2 , 旨在理解 本地方法--从java 程序中调用C函数 的基础知识 : 2) for source code, ...

  4. 苹果系统手机调用java线程出错_在多线程Java应用程序中调用已编译的m-file(.jar)时出错...

    我有一个简单的M文件 function [fRate,Height,Width] = media(filename) obj = mmreader(filename); fRate = obj.Fra ...

  5. 在C# winform程序中调用WPF写的数学公式编辑器

    由于工作原因,需要在程序中加入数学公式编辑功能,因此在网上找了不少开源数学公式程序.经过比较,最终选择了Math-Editor-master程序(可以在github上搜索此名称). 我的程序(简称主程 ...

  6. 在VB应用程序中调用Excel2000

    Visual Basic简称(VB)是设计Windows应用程序强有力的开发工具,"全球绝大多数Windows应用程序都是用VB开发的": Excel是目前使用最广泛的办公应用软件 ...

  7. Linux jsp php集成环境,ImageMagick在程序中调用(linux环境,jsp,php)

    最近发现图片格式为cmyk时,图片上传浏览器不能正常显示,图片缩放会变成黑屏, 后来通过google发现imagemagick的功能很强大,安装可以采用两种方法,1)直接与php编译安装,在程序中调用 ...

  8. 在Delphi程序中调用控制面板设置功能

    ====================================================== 注:本文源代码点此下载 ================================= ...

  9. 安卓程序中调用 linux 命令

    博客: 安卓之家 微博: 追风917 CSDN: 蒋朋的家 简书: 追风917 在研究串口 jni 开发的时候,遇到了这样一段代码: Process su;su = Runtime.getRuntim ...

最新文章

  1. 马斯克入选美国工程院院士,张宏江博士入选外籍院士
  2. IPv6扩展头部 (四) 分片头部 Fragment Header for IPv6
  3. python js 效率_巧用 db.system.js 提升20% 开发效率
  4. 1.Cocos2dx 3.2中vector,ValueMap,Touch触摸时间的使用.iconv字符编解码
  5. There is no tracking information for the current branch
  6. Apache启动错误:could not bind to address[::]:443
  7. apache 配置php 版本错误u,PHP+Apache+MySQL 在配置环境时遇到的问题
  8. JSP HTTP 状态码
  9. 卸载linux订阅包
  10. 苏联W ndows视频,俄罗斯大神win10精简版32位
  11. 如何使用迭代器Iterator与增强for循环遍历Map集合?
  12. 网易云视频直播推流集成大致过程
  13. 中国(广西)壮语春节联欢晚会将举办
  14. 显示杂谈(1)-Gamma到底是个什么鬼
  15. 软件测试“摆烂”已经成为常态化,我们应该怎样冲出重围?
  16. 计算机网络组成复习笔记
  17. 基于Xilinx LUT6设计高效紧凑的2:1 Bus Mux
  18. Android Studio 开发(二)问题
  19. 什么是 jQuery ?
  20. 没别的,就聊聊数据通信网络

热门文章

  1. iview/view UI 表格+表单提交必填验证简单方案
  2. 采访赵然:天天动听的精益之路
  3. 作为一名测试工程师,你真的知道“微信红包”怎么测试吗?
  4. 在信号传输当中,载波和调制波的关系
  5. fluent旋转机械滑移网格法设置
  6. 人工智能 漆桂林_东南大学计算机科学与工程学院硕导介绍:漆桂林
  7. google dns 怎么用 ,google dns 的ip 设置 方法介绍
  8. 非同质化通证在商业模式中如何应用
  9. 12000字解读瑞幸咖啡:“异军突起”与“绝处逢生”的奥秘
  10. Tomcat出现validateJarFile-jar not loaded问题