C#创建AcadApplication实例时,有时候会创建实例失败,找了好久,参考以下链接整理了一下代码,经过测试,运行ok。

ref: http://through-the-interface.typepad.com/through_the_interface/2010/02/handling-com-calls-rejected-by-autocad-from-an-external-net-application.html

ref: http://social.msdn.microsoft.com/Forums/en-US/vsto/thread/1dab0874-bba5-481a-9986-a11a66efa0a0

ref: http://msdn.microsoft.com/en-us/library/ms693740(VS.85).aspx

using System; using System.Collections.Generic; using System.Linq; using System.Text; using Autodesk.AutoCAD.Interop; using System.Runtime.InteropServices; using System.Diagnostics; using System.Threading; using Microsoft.Win32; namespace AcadUtils { public enum AcadVersion { Acad2009, Acad2010, Unknow } [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("00000016-0000-0000-C000-000000000046")] public interface IMessageFilter { [PreserveSig] int HandleInComingCall( int dwCallType, IntPtr hTaskCaller, int dwTickCount, IntPtr lpInterfaceInfo ); [PreserveSig] int RetryRejectedCall( IntPtr hTaskCallee, int dwTickCount, int dwRejectType ); [PreserveSig] int MessagePending( IntPtr hTaskCallee, int dwTickCount, int dwPendingType ); } public class AcadMgr:IMessageFilter { static string progID; IMessageFilter oldFilter; AcadApplication acapp = null; [DllImport("ole32.dll")] static extern int CoRegisterMessageFilter( IMessageFilter lpMessageFilter, out IMessageFilter lplpMessageFilter ); static AcadMgr() { if (AcadVer == AcadVersion.Acad2009) progID = "AutoCAD.Application.17"; else if (AcadVer == AcadVersion.Acad2010) progID = "AutoCAD.Application.18"; else progID = "Unknown"; } public AcadMgr() { CoRegisterMessageFilter(this, out oldFilter); try { acapp = (AcadApplication)Marshal.GetActiveObject(progID); } catch { try { Type acType = Type.GetTypeFromProgID(progID); acapp = (AcadApplication)Activator.CreateInstance(acType, true); } catch { System.Windows.Forms.MessageBox.Show("cannot create object type " + progID); } } if (acapp != null) { acapp.Visible = true; } } public AcadApplication Application { get { return acapp; } } public static AcadVersion AcadVer { get { try { RegistryKey acadKey = Registry.CurrentUser.OpenSubKey("Software//Autodesk//AutoCAD"); string acadVerNum = acadKey.GetValue("CurVer").ToString(); if (acadVerNum == "R18.0") return AcadVersion.Acad2010; else if (acadVerNum == "R17.0") return AcadVersion.Acad2009; else return AcadVersion.Unknow; } catch { return AcadVersion.Unknow; } } } int IMessageFilter.HandleInComingCall( int dwCallType, IntPtr hTaskCaller, int dwTickCount, IntPtr lpInterfaceInfo ) { return 0; } int IMessageFilter.RetryRejectedCall( IntPtr hTaskCallee, int dwTickCount, int dwRejectType ) { return 1000; } int IMessageFilter.MessagePending( IntPtr hTaskCallee, int dwTickCount, int dwPendingType ) { return 1; } } }

C#创建Autocad实例相关推荐

  1. Civil 3D 二次开发 创建AutoCAD对象—— 00 ——

    不积跬步无以至千里,不积小流无以成江海.虽然创建一条直线.添加一个图层这样的小程序没有什么实际意义(内部命令很简单就可以完成),但对于初学二次开发的您来说,这可是一大步,这一步跨出去,您就跨进了二次开 ...

  2. python创建类的实例方法-Python中动态创建类实例的方法

    简介 在Java中我们可以通过反射来根据类名创建类实例,那么在Python我们怎么实现类似功能呢? 其实在Python有一个builtin函数import,我们可以使用这个函数来在运行时动态加载一些模 ...

  3. 众所周知,static修饰的成员只实例化一次,而string类型每次赋值都会重新创建一个实例,那么用static修饰string呢?...

    string 类型每次实例化都会重新创建一个实例: 解释:string 类型重载了运算符 "=" ,每次 "=" 操作都是一次 "new". ...

  4. 详解Linux交互式shell脚本中创建对话框实例教程

    详解Linux交互式shell脚本中创建对话框实例教程 本教程我们通过实现来讲讲Linux交互式shell脚本中创建各种各样对话框,对话框在Linux中可以友好的提示操作者,感兴趣的朋友可以参考学习一 ...

  5. NSubstitute完全手册(二)创建替代实例

    创建一个替代实例的基本语法: var substitute = Substitute.For<ISomeInterface>(); 这就是通常情况下你创建一个类型的替代实例的方法.一般来说 ...

  6. oracle 辅助实例,初学rman问题小记三:创建辅助实例遇到的ORA-01031

    参考[三思笔记]一步一步学DataGuard文档做dg的开始准备阶段,做主库的副本数据库,做副本数据库的第一阶段,创建辅助实例,基本过程为: 1.创建密码文件 2.创建初始化参数文件 3.连接并启动辅 ...

  7. celery mysql flask_如何在Flask中创建Celery实例?

    我在flask程序中使用了工厂函数和蓝本,把Flask实例的创建放在了manage.py中(看过Flask Web开发这本书的同学应该懂我). 现在我想要创建一个Celery的实例(在app程序包中) ...

  8. 【Android 插件化】Hook 插件化框架 ( Hook Activity 启动流程 | 主线程创建 Activity 实例之前使用插件 Activity 类替换占位的组件 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

  9. EntityFramework Core 1.1是如何创建DbContext实例的呢?

    前言 上一篇我们简单讲述了在EF Core1.1中如何进行迁移,本文我们来讲讲EF Core1.1中那些不为人知的事,细抠细节,从我做起. 显式创建DbContext实例 通过带OnConfiguri ...

最新文章

  1. 利用 AssemblyAI 在 PyTorch 中建立端到端的语音识别模型
  2. java rsa数字签名_RSA 数字签名算法(Java版)
  3. 英特尔530和535哪个好_详细介绍2020版联想小新Air 14酷睿版和锐龙版怎么选,哪款好...
  4. 记录一次centos的双网卡绑定
  5. C#对象初始化的探讨
  6. AWS RDS强制升级的应对之道——版本升级的最佳实践
  7. 第10 章继承映射(InheritanceMappings)
  8. 【Flink】Flink Container exited with a non-zero exit code 143
  9. MyBatis中resultType返回值类型介绍
  10. 2d isometric 坐标变换
  11. java spring 源码下载_Spring源码下载
  12. 129个百度网盘资源搜索网站大全(建议收藏)
  13. java maven 配置环境变量_maven 环境变量的配置详解
  14. 小程序 长按转发_微信小程序实现限制用户转发功能的实例代码
  15. 最简单PS双重曝光效果制作教程
  16. 职场必备:十句外企 office 常用英语
  17. 【网络设备】H3C FW V7:安全域与域间策略
  18. 武汉疫情之后,中国即将发生的10大变化!!
  19. 深度分析网络游戏运营手段
  20. anchor free:CornerNet解读【目标检测】

热门文章

  1. 喷射派对维护服务器,喷射派对_喷射派对官网版预约_9k9k手游网
  2. 开源进度跟踪 33复杂美Chain33
  3. 加拿大联邦技术移民,好多朋友咨询,其实看看英文比什么都强,翻译稿如下
  4. JavaScript面向对象(下)
  5. websphere Error 404:SRVE0190E
  6. 应用架构COLA3.0:让事情回归简单
  7. Pinyin Comparison 拼音辨别 V1.1.2
  8. 顶层const与底层const
  9. 大家知道如何关闭花呗吗
  10. React Native之常用第三方库