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

如何在Autocad中使用C#关闭文件以保持acad.exe运行?,c#,file,autocad,C#,File,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应保持运行) 到目前为

我正在使用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();
    }
}

我怀疑您能否做到这一点,除非AutoCAD有一个API,您可以连接到该API并要求它为您关闭该文件


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

从Autodesk站点()获取Autocad.NET库

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


您可以找到许多关于这方面的文章,并可以提出进一步的问题。

此外,您不应该使用Kill,除非进程没有响应,而且肯定不会在关闭MainWindow后立即使用


CloseMainWindow是要求应用程序自行关闭的礼貌方式。杀戮就像从插座中拔出电源线。您没有给它一个清理自身并干净地退出的机会。

还有一种可能性-只有当您的C#代码与AutoCAD进程在同一台机器上运行时,这才有效,并且不建议您这样做,但是,如果您真的陷入困境并准备忍受窗口切换的麻烦,您可以使用SendKeys命令向应用程序发送按键

MSDN文章如下:


使用此选项,您可以发送按键以模拟用户使用菜单命令关闭文件

AutoCAD确实有一个api。有4个议会。两个用于进程中,两个用于COM

foreach (Process Proc in Process.GetProcesses())
{
    if (Proc.ProcessName.Equals("acad"))
    {
        Proc.CloseMainWindow();
        Proc.Kill();
    }
}
进程内: acdbmgd.dll acmgd.dll

共产国际: 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 = "<<Unnamed Profile>>";
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);
            }
        }
    }
    }
}

请原谅我的密码。这太糟糕了,这是我刚开始开发…

时的第一个方法。要执行文件关闭,最好的方法是按照这里的步骤,用下面的代码更改下面的代码

            [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);
                        }
                    }
                }

任何代码都是非常有用的,因为我在过去几个小时里一直在努力,但都是徒劳的。谢谢你……几分钟的搜索让我想到了这一点,这看起来是一个很好的开始:我认为你没有什么可以做的。您可以立即重新启动该进程,以便为下一个文件做好准备。我正在处理它,它只是在打开文件时出现了一个无休止的异常“WindowsFormsApplication1.exe中出现了“System.InvalidCastException”类型的第一次意外异常”Trae Moore完全正确。COMInterop界面完成了这项工作。只需确保使用正确的平台dll(win-32或x64),它就像魔术一样工作,不需要做很多事情。。刚输入一行,它就可以工作了。谢谢。:-:-:-):-:-):-)行是SendKeys.SendWait(“^{F4}”);检查答案并尝试一下,毫无疑问这是一个更好的选择,我最终使用了它。