在C#进行CAD二次开发时,生成DLL失败并提示“原来的DLL被CAD占用”,通常是因为之前编译的DLL文件已被CAD应用程序加载并锁定,导致Visual Studio无法覆盖写入新编译的DLL文件。以下是几种核心解决方案:

1. 关闭CAD进程后重新编译

这是最直接的方法。在Visual Studio中重新生成项目前,确保所有已打开并加载了该插件的CAD实例(如AutoCAD、中望CAD等)都已完全关闭。

  • 操作步骤
    1. 保存所有工作,关闭所有CAD程序。
    2. 在任务管理器中检查是否还有 acad.exezwcad.exe 或相关进程残留,并结束它们。
    3. 返回Visual Studio,执行“重新生成解决方案”。

2. 使用动态加载与调试技术(无需关闭CAD)

通过编写一个“加载器”DLL,在CAD中动态加载和卸载你的主开发DLL,从而实现不断开CAD连接的热编译调试。

  • 原理:创建一个独立的“加载器”项目。该加载器在CAD中通过 NETLOAD 命令加载后,可以调用 Assembly.LoadFrom 来加载你的主开发DLL。当需要更新代码时,只需在Visual Studio中重新生成主DLL,然后在CAD中通过加载器命令重新加载即可,因为CAD锁定的只是加载器DLL,而非主开发DLL。

  • 核心代码示例(加载器项目)

    using System;
    using System.IO;
    using System.Reflection;
    using System.Windows.Forms;
    using Autodesk.AutoCAD.Runtime;
    
    namespace DllLoader {
        public class Commands {
            [CommandMethod("NLX")]
            public void NetLoadX()
            {
                OpenFileDialog dlg = new OpenFileDialog();
                dlg.Filter = "DLL files (*.dll)|*.dll";
                dlg.Title = "选择要加载的插件DLL";
                if (dlg.ShowDialog() == DialogResult.OK)
                {
                    string dllPath = dlg.FileName;
                    try {
                        // 动态加载指定的DLL
                        Assembly.LoadFrom(dllPath);
                        Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage($"
    

成功加载: {Path.GetFileName(dllPath)}");
}
catch (Exception ex)
{
MessageBox.Show($"加载失败: {ex.Message}");
}
}
}
}
}
```
(此代码创建了一个 NLX 命令,允许在CAD运行时浏览并加载你的主开发DLL文件)

  • 工作流程
    1. 将上述“加载器”DLL通过 NETLOAD 命令加载到CAD中。
    2. 你的主开发项目(例如 MyCadTools)正常编写代码。
    3. 编译 MyCadTools 生成 MyCadTools.dll
    4. 在CAD命令行输入 NLX,选择新生成的 MyCadTools.dll 进行加载和测试。
    5. 需要修改 MyCadTools 的代码时,直接在VS中重新生成 MyCadTools.dll(此时CAD未锁定此文件),然后在CAD中再次执行 NLX 命令重新加载即可。

3. 修改输出路径或使用生成后事件

通过改变DLL的输出位置,避免直接覆盖被锁定的文件。

  • 方法一:修改项目输出目录
    在项目属性 -> “生成” -> “输出路径”中,将DLL输出到一个新目录(如 ..\bin\DebugV2\)。这样每次编译都会生成一个新文件,不会被已加载的旧DLL锁定。

  • 方法二:使用生成后事件重命名DLL
    在项目属性 -> “生成事件” -> “后期生成事件命令行”中,添加脚本,使每次编译生成的DLL都带有唯一标识(如时间戳或递增版本号),从而避免文件名冲突。

     

4. 确保项目配置正确

错误的项目配置也可能导致生成或加载失败,间接引发占用问题。

  • 平台目标:确保项目生成的目标平台(如x64)与您使用的CAD版本(32位或64位)一致。
  • .NET Framework版本确认项目使用的.NET Framework版本在CAD的支持范围内。
  • 引用路径:检查对CAD托管库(如 AcDbMgd.dll, AcMgd.dll或中望的 ZwDatabaseMgd.dll 等)的引用是否正确,并确保“复制本地”属性设置为 False,以避免不必要的文件锁定。

解决方案对比与选择建议

解决方案 优点 缺点 适用场景
关闭CAD后编译 简单直接,无需额外代码 开发调试效率低,需频繁重启CAD 初期项目搭建、简单测试
动态加载调试 无需关闭CAD,调试效率高,是专业开发的常用实践 需要额外创建一个加载器项目,流程稍复杂 中大型项目、需要频繁调试和迭代
修改输出路径 配置简单,避免文件覆盖冲突 可能产生大量中间文件,需要手动管理加载 临时解决锁定问题,或作为辅助手段
检查项目配置 从根本上避免因配置错误导致的异常 无法直接解决已发生的文件锁定 作为常规检查和预防措施

首选推荐:对于常规开发调试,采用动态加载调试方案(方案2) 能极大提升开发体验。对于偶尔的编译,可以临时使用关闭CAD(方案1)。同时,务必确保项目配置(方案4) 正确无误。


参考来源

 

更多推荐