我正在为我的应用程序开发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/

10-13 09:02