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;
}
}
}
<p>这么快就用2011了,呵呵</p>
页:
[1]