gsteven 发表于 2010-6-8 15:16:00

AutoCAD2011的一个bug?

在创建CAD2011进程时,出现一个问题,通过下列方法已经解决了。
见代码。问题在于:
对于2000到2010版本
通过这段可以成功创建
                  Type objClassType = Type.GetTypeFromProgID(ProgID);
                  //新建2011版本时,报异常,但是acad进程会创建,再转入异常去获取该进程
                  //其他版本不会出现异常,不会转入异常
                  this._App = Activator.CreateInstance(objClassType);
但对于2011则报错,所以想到了下列代码的那段异常处理,不知道还有人是否有这个问题,或者有更好的解决办法?
下列代码已经通过测试,2000值2011个版本均可。

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Reflection;
using System.Diagnostics;

    /// <summary>
    /// AutoCAD版本
    /// </summary>
    public enum AcadVersion
    {
      /// <summary>
      /// AutoCAD2000~2003
      /// </summary>
      R15 = 15,
      /// <summary>
      /// AutoCAD2004~2006
      /// </summary>
      R16 = 16,
      /// <summary>
      /// AutoCAD2007~2009
      /// </summary>
      R17 = 17,
      /// <summary>
      /// AutoCAD2010~2011~更高
      /// </summary>
      R18 = 18,
         /// <summary>
      /// 其他版本
      /// </summary>
      Other=-1
    }
/// <summary>
      /// 构造函数,创建系统的默认版本, 使用现有acad进程, 若不存在则启动新的acad进程
      /// </summary>
      public AcadApplication()
      {
            ProgID = "AutoCAD.Application";
            AcadApplicationCall();
      }
      /// <summary>
      /// 构造函数, 指定版本创建acad,使用现有acad进程, 若不存在则启动新的acad进程
      /// </summary>
      public AcadApplication(AcadVersion version)
      {
            ProgID = "AutoCAD.Application" + "." + System.Convert.ToUInt32(version);
            if (version == AcadVersion.Other)
            {
                ProgID = "AutoCAD.Application";
            }
            AcadApplicationCall();
      }
      private void AcadApplicationCall()
      {
            Process[] p = Process.GetProcessesByName("acad");
            bool exist_acad = false;
            if (p == null || p.Length == 0)
                exist_acad = false;
            else
                exist_acad = true;
            if (!exist_acad)
            {
                try
                {
                  Type objClassType = Type.GetTypeFromProgID(ProgID);
                  //新建2011版本时,报异常,但是acad进程会创建,再转入异常去获取该进程
                  //其他版本不会出现异常,不会转入异常
                  this._App = Activator.CreateInstance(objClassType);
                  this._IsNewApp = true;
                }
                catch (System.Exception e)
                {
                  //获取acad进程
                  this._App = System.Runtime.InteropServices.Marshal.GetActiveObject(ProgID);
                  this._IsNewApp = true;
                }
            }
            else
            {
                try
                {
                  this._App = System.Runtime.InteropServices.Marshal.GetActiveObject(ProgID);
                  this._IsNewApp = false;
                }
                catch
                {
                  Type objClassType = Type.GetTypeFromProgID(ProgID);
                  this._App = Activator.CreateInstance(objClassType);
                  this._IsNewApp = true;
                }
            }
      }

雪山飞狐_lzh 发表于 2010-6-8 18:09:00

<p>这么快就用2011了,呵呵</p>
页: [1]
查看完整版本: AutoCAD2011的一个bug?