# AutoCADDotNet
**Repository Path**: yaojing38/AutoCADDotNet
## Basic Information
- **Project Name**: AutoCADDotNet
- **Description**: 提供AutoCAD二次开发,.net需要使用的ObjectARX包。
- **Primary Language**: C#
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 2
- **Created**: 2023-05-31
- **Last Updated**: 2023-11-15
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# AutoCADDotNet
提供`AutoCAD`二次开发`.Net`需要使用的`ObjectARX`包。
## 快速使用
```xml
net461
```
- 不考虑`AutoCAD2009`及以下的版本。
- 当使用`TargetFramework`为`net35`及以下时,适用于`AutoCAD2010-2012`版本。
- 当使用`TargetFramework`为`net40`及以上时,适用于`AutoCAD2013`及以上版本。
- 提供`MSBuild`属性常用值。
## 功能
#### `AutoCAD2010-2012`版本
当使用`TargetFramework`为`net35`及以下时,提供`ObjectARX2010`包中的`AcMgd.dll`等依赖,和包中的`x64`的`Autodesk.AutoCAD.Interop.dll`,及`ObjectARX2018`包中的`xml`注释文档。且这些依赖不会复制到生成目录下。
#### `AutoCAD2013`及以上版本
当使用`TargetFramework`为`net40`及以上时,提供`ObjectARX2013`包中的`AcMgd.dll`等依赖,和包中的`x64`的`Autodesk.AutoCAD.Interop.dll`,及`ObjectARX2018`包中的`xml`注释文档。**并提供`Microsoft.CSharp`的引用**。且这些依赖不会复制到生成目录下。
#### 提供`MSBuild`属性常用值
项目`csproj`中不用提供下方的属性,已由`AutoCADDotNet`包提供。
```xml
true
true
true
None
```
## 插件编译知识
### 版本图

### 如何选择`.NET Framework`版本?
请查看**上图最后一行的文字**,其中`2.0`和`4.0`指[CLR 版本](https://learn.microsoft.com/zh-cn/dotnet/framework/migration-guide/versions-and-dependencies)。也可以理解为,`.net`程序编译为`IL`代码,`2.0`和`4.0`为`IL`的版本。
`[CommandMethod("")]`采用的是`反射`的技术才能运行插件中的命令函数。`2.0CLR`和`4.0CLR`互不兼容,**不能相互使用反射的技术**,反射技术在同`CLR`版本不存在`.NET Framework`版本兼容的问题。主程序`AutoCAD`和插件程序可以任意设置同`CLR`版本的`.NET Framework`版本。
**结论**:`AutoCAD2006-2012`应采用`net35`编译插件,`AutoCAD2013+`可以使用任意的`net40+`的版本编译插件。
### 如何选择`ObjectARX`开发包?
在测试`AutoCAD2013+`与`ObjectARX2013+`的关系时,任意的组合,都可以编译并执行成功,但运行`AutoCAD2013`没有的高版本`api`就会报错。`AutoCAD2006-2012`版本也遵循上面的道理,区别在于`AutoCAD2013+`的`api`**相对稳定**,而`AutoCAD2006-2012`的`api`相对不稳定。`AutoCAD2006-2012`**理论**上可以通用一个版本,但由于常用的`AutoCAD API`的不同,因此还需进一步拆分版本。
**经验性结论**:根据`AutoCAD API`的经验,`AutoCAD2013+`开发建议选择最低版本`ObjectARX2013`开发包。`AutoCAD2006-2012`可以根据`com`的版本划分进行拆分。
### 如何选择的`com`版本?
使用`Autodesk.AutoCAD.Interop.AcadApplication`转到定义查看`GuidAttribute`的值相同的代表可以互相通用。
**结论**:不用区分`32位`和`64位`,`Autodesk.AutoCAD.Interop.Common.dll`和`Autodesk.AutoCAD.Interop.dll`的划分范围:
- `AutoCAD2006`为一个范围。
- `AutoCAD2007-2009`为一个范围,可以互相通用。
- `AutoCAD2010-2012`为一个范围,可以互相通用。
- `AutoCAD2013+`为一个范围,可以互相通用。
### 编译时与运行时
由于`acad.exe`**运行时**已经提供好了`ObjectARX`和`com`的环境了,因此可以不用把这些`dll`复制到生成目录下,但需要**编译时**提供`ObjectARX`和`com`的环境。
> 小知识:`ObjectARX`提供的`dll`反编译后是空壳子。
### 测试时的特例
当开发 AutoCAD2012 时,必须使用`ObjectARX2012`,`net35`和`net40`都可以编译并执行成功。如果换成`ObjectARX2013`则不能成功。此特例不影响结论。
## QQ 群
