我正在为我的应用程序开发AutoCAD插件。我使用的是AutoCAD2012。插件会打开.NET命名管道,因此可以非常轻松地从桌面应用程序连接到它。
首先,我创建了一个界面。这里是
[ServiceContract]
public interface IConnector
{
[OperationContract]
[FaultContract(typeof(Exception))]
void GetPdfVersion(string filePath, string exportFilePath);
}
我的AutoCAD插件派生自IExtensionApplication接口,因此在Initialize方法中,我已编写此代码
this.host = new ServiceHost(typeof(Printer), new[] { new Uri("net.pipe://localhost") });
this.host.AddServiceEndpoint(typeof(IConnector), new NetNamedPipeBinding(), "GetPdfVersion");
this.host.Open();
在一项功能中,我需要打开文档并进行处理。
所以,我写了下面的代码
var docColl = Application.DocumentManager;
Document curDraw = null;
try
{
if (File.Exists(@"d:\1.dwg"))
{
curDraw = docColl.Open(@"d:\1.dwg", true, string.Empty);
}
}
catch (Exception e)
{
Console.WriteLine(e);
}
但是它在
curDraw = docColl.Open(@"d:\1.dwg", true, string.Empty);
代码上引发了HRESULT = -2147418113的COM异常。我需要Document对象来处理dwg文件。有没有可能解决该错误的方法?
最佳答案
AutoCAD无法使用来自外部线程的文档对象。这就是问题的根源。如果我编写方法并放入CommandMethodAttribute-它将起作用,但只能在AutoCAD控制台中使用...但是,如果我需要从外部应用程序执行此操作怎么办?
首先,需要在服务行为类上指定属性
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Single, IncludeExceptionDetailInFaults = true)]
因此,只能将一个线程用于所有操作。
下一步,在
Initialize()
方法中,获取CurrentDispatcher对象,并将其放入静态变量中。private static Dispatcher dispatcher;
public void Initialize()
{
dispatcher = Dispatcher.CurrentDispatcher;
this.host = new ServiceHost(typeof(Printer), new[] { new Uri("net.pipe://localhost") });
this.host.AddServiceEndpoint(typeof(IConnector), new NetNamedPipeBinding(), "GetPdfVersion");
this.host.Open();
}
通过这种方式,可以实现对AutoCAD执行上下文的控制。下一步是通过调度程序调用该方法
public void GetPdfVersion(string filePath, string exportFilePath)
{
dispatcher.Invoke(new Action<string, string>(this.GetPdfVer), filePath, exportFilePath);
}
因此,通过使用此方法,我可以从外部应用程序运行
GetPdfVer
方法中包含的代码,并获得使用WCF而不是COM交互的所有好处。关于c# - DocumentCollection.Open()函数无法使用AutoCAD API,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20487811/