C# CAD二次开发DLL编译失败解决办法
在C#进行CAD二次开发时,生成DLL失败并提示“原来的DLL被CAD占用”,通常是因为之前编译的DLL文件已被CAD应用程序加载并锁定,导致Visual Studio无法覆盖写入新编译的DLL文件。以下是几种核心解决方案:
1. 关闭CAD进程后重新编译
这是最直接的方法。在Visual Studio中重新生成项目前,确保所有已打开并加载了该插件的CAD实例(如AutoCAD、中望CAD等)都已完全关闭。
- 操作步骤:
- 保存所有工作,关闭所有CAD程序。
- 在任务管理器中检查是否还有
acad.exe、zwcad.exe或相关进程残留,并结束它们。 - 返回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文件)
- 工作流程:
- 将上述“加载器”DLL通过
NETLOAD命令加载到CAD中。 - 你的主开发项目(例如
MyCadTools)正常编写代码。 - 编译
MyCadTools生成MyCadTools.dll。 - 在CAD命令行输入
NLX,选择新生成的MyCadTools.dll进行加载和测试。 - 需要修改
MyCadTools的代码时,直接在VS中重新生成MyCadTools.dll(此时CAD未锁定此文件),然后在CAD中再次执行NLX命令重新加载即可。
- 将上述“加载器”DLL通过
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) 正确无误。
参考来源
- 中望CAD2020 .NET二次开发(C#)
- cad c# 二次开发 ——动态加载dll 文件制作(loada netloadx)
- CAD二次开发C#01
- CAD二次开发不关闭CAD进行编译调试代码片段
- AutoCAD开发如何使得同一个dll适配多种不同版本的CAD, 并在CAD打开的时候自动启动插件
更多推荐
所有评论(0)