如何使用C#保持acad.exe运行在Autocad中关闭文件?

我正在使用visual studio 2010,我有一个.DWG文件,我想在autocad中打开。 直到现在我已经用过了。

Process p = new Process(); ProcessStartInfo s = new ProcessStartInfo("D:/Test File/" + fileName); p.StartInfo = s; p.Start(); 

但我想要的是关闭Autocad中的文件,而不是autocad本身。 (表示atocad.exe应该继续运行)。

直到现在我已经使用过这个,但它关闭了acad.exe而不是文件。

 foreach (Process Proc in Process.GetProcesses()) { if (Proc.ProcessName.Equals("acad")) { Proc.CloseMainWindow(); Proc.Kill(); } } 

从Autodesk站点获取Autocad .NET库( http://usa.autodesk.com/adsk/servlet/index?id=773204&siteID=123112

然后,您将能够使用ApplicationDocument类。 它们将使您完全控制应用程序中的打开和关闭文档。

你可以找到很多文章,并可以提出进一步的问题。

AutoCAD确实有api。 有4个组装。 两个用于进程中,两个用于COM。

inprocess:acdbmgd.dll acmgd.dll

COMInterop:Autodesk.Autocad.Interop.dll Autodesk.Autocad.Interop.Common.dll

这是一种打开AutoCAD新实例的方法,它将连接到现有的AutoCAD运行实例。

您需要将这些.dll加载到项目引用中。

 using Autodesk.AutoCAD.Interop; using Autodesk.AutoCAD.Interop.Common; namespace YourNameSpace { public class YourClass { AcadApplication AcApp; private const string progID = "AutoCAD.Application.18.2";// this is AutoCAD 2012 program id private string profileName = "<>"; private const string acadPath = @"C:\Program Files\Autodesk\AutoCAD 2012 - English\acad.exe"; public void GetAcApp() { try { AcApp = (AcadApplication)Marshal.GetActiveObject(progID); } catch { try { var acadProcess = new Process(); acadProcess.StartInfo.Arguments = string.Format("/nologo /p \"{0}\"", profileName); acadProcess.StartInfo.FileName = (@acadPath); acadProcess.Start(); while(AcApp == null) { try { AcApp = (AcadApplication)Marshal.GetActiveObject(progID); } catch { } } } catch(COMException) { MessageBox.Show(String.Format("Cannot create object of type \"{0}\"",progID)); } } try { int i = 0; var appState = AcApp.GetAcadState(); while (!appState.IsQuiescent) { if(i == 120) { Application.Exit(); } // Wait .25s Thread.Sleep(250); i++; } if(AcApp != null){ // set visibility AcApp.Visible = true; } } catch (COMException err) { if(err.ErrorCode.ToString() == "-2147417846"){ Thread.Sleep(5000); } } } } } 

关闭它就像

 Application.Exit(); 

并原谅代码。 它是残暴的,这是我刚开始开发时的第一个方法之一……

我怀疑你能否做到这一点,除非AutoCAD有一个你可以挂钩的API,并要求它为你关闭文件。

您的c#app只能对进程执行操作(acad.exe),它无权访问该进程的内部操作。

此外,您不应该使用Kill,除非该过程变得无响应,当然不会在CloseMainWindow之后立即使用。

CloseMainWindow是一种礼貌的方式,要求应用程序关闭自己。 杀死就像从sockets中拔出电源线。 你没有给它机会清理自己并干净利落地退出。

还有另外一种可能性 – 这只有在你的C#代码与AutoCAD进程在同一台机器上运行时才有效,并且不是真的推荐它,但是,如果你真的被卡住并且准备好忍受窗口切换的麻烦您可以使用SendKeys命令将击键发送到应用程序。

MSDN文章: http : //msdn.microsoft.com/EN-US/library/ms171548( v = VS.110, d = hv.2) .aspx http://msdn.microsoft.com/en-us/库/ system.windows.forms.sendkeys.send.aspx

使用此function,您可以使用菜单命令发送击键来模拟用户以关闭文件。

要执行文件关闭,最好的方法是按照此ObjectARX SDK中的步骤执行c#,并使用以下代码更改以下代码。

  [CommandMethod("CD", CommandFlags.Session)] static public void CloseDocuments() { DocumentCollection docs = Application.DocumentManager; foreach (Document doc in docs) { // First cancel any running command if (doc.CommandInProgress != "" && doc.CommandInProgress != "CD") { AcadDocument oDoc = (AcadDocument)doc.AcadDocument; oDoc.SendCommand("\x03\x03"); } if (doc.IsReadOnly) { doc.CloseAndDiscard(); } else { // Activate the document, so we can check DBMOD if (docs.MdiActiveDocument != doc) { docs.MdiActiveDocument = doc; } int isModified = System.Convert.ToInt32( Application.GetSystemVariable("DBMOD") ); // No need to save if not modified if (isModified == 0) { doc.CloseAndDiscard(); } else { // This may create documents in strange places doc.CloseAndSave(doc.Name); } } }