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