基于基恩沃姆斯利的建议在这里与AutoCAD互操作对象时我始终贯彻IMessageFilter:http://adndevblog.typepad.com/autocad/2012/05/cannot-instantiate-autocad-2010-from-an-external-net-application-after-installing-update-1.html
// IMessageFilter Interface
[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 partial class Form1 : Form, IMessageFilter
{
public Form1()
{
InitializeComponent();
CoRegisterMessageFilter(this, null);
}
int IMessageFilter.HandleInComingCall(int dwCallType, IntPtr hTaskCaller, int dwTickCount, IntPtr lpInterfaceInfo)
{
// SERVERCALL_ISHANDLED
return 0;
}
int IMessageFilter.RetryRejectedCall(IntPtr hTaskCallee, int dwTickCount, int dwRejectType)
{
// Retry in a second
return 1000;
}
int IMessageFilter.MessagePending(IntPtr hTaskCallee, int dwTickCount, int dwPendingType)
{
// PENDINGMSG_WAITNOPROCESS
return 1;
}
[DllImport("ole32.dll")]
private static extern int CoRegisterMessageFilter(IMessageFilter lpMessageFilter, IMessageFilter lplpMessageFilter);
...
}
这似乎是基本上是告诉那些COM例外闭嘴,然后等待AutoCAD的COM对象要准备好
。
但是我不得不提到,如果你只是在每张图纸上运行脚本,LISP,命令行开关/ b,甚至Viru在AutoDesk网站上编写的ScriptPro(http://labs.autodesk.com/utilities/ ADN_plugins/catalog)可能是更简单的选项。 –