第一步,要实现同一个dll兼容用户电脑上多个版本的AutoCAD, 首先需要获取用户电脑上所有已经安装的CAD版本
这里要先定义一个字符串列表,用来存放所有的CAD版本
public List<String> m_allVersion;
通过注册表获取用户电脑上所有已安装的CAD版本,
相关方法如下:
/// <summary>
/// 获取用户电脑上所有已安装的AutoCAD版本
/// </summary>
private void getAllCADVersion()
{
//this.tb_path.Text = m_setUpPath; //设置
m_allVersion = new List<string>();
try
{
//获取所有AutoCAD版本并填充到版本选择框中
String[] tmp = SetupProcess.GetAutoKeyName().Split('\n');
foreach (String str in tmp)
{
if (str == "") continue; //如果是空字符串就跳过
m_allVersion.Add(str);
}
}
catch
{
string errorString = "获取注册表CAD版本号失败!";
MessageBox.Show(errorString, "ERROR");
logger.LogError(errorString);
}
//if (cb_version.Items.Count > 0) cb_version.SelectedIndex = cb_version.Items.Count - 1;
}
/// <summary>
/// 获取CAD所属注册表键名(HKEY_CURRENT_USER\SOFTWARE\Autodesk\AutoCAD\R20.1\ACAD-F001:804)
/// </summary>
/// <returns>返回所有版本的注册表键名(SOFTWARE\Autodesk\AutoCAD\R20.1\ACAD-F001:804)</returns>
public static String GetAutoKeyName()
{
String ret = "";
RegistryKey keyRoot = Registry.CurrentUser;
RegistryKey keyCAD = keyRoot.OpenSubKey("Software\\Autodesk\\AutoCAD"); //CAD表键目录
String[] CADPreVersions = keyCAD.GetSubKeyNames(); //CAD各版本代号如(CAD2016 R20.1)
if (CADPreVersions.Length < 1) return ret; //没有安装CAD
for (int i = 0; i < CADPreVersions.Length; i++)
{
keyCAD = keyRoot.OpenSubKey("Software\\Autodesk\\AutoCAD" + "\\" + CADPreVersions[i]);
if (keyCAD.GetValue("CurVer") != null)
{
String str = (keyCAD.GetValue("CurVer").ToString());
RegistryKey KeyVersion = keyCAD.OpenSubKey(str);
ret += KeyVersion.Name.Substring(keyRoot.Name.Length + 1) + "\n";
}
}
return ret;
}
第二步,定义本插件支持的CAD版本,进行比对
以下定义一些相关属性:
/// <summary>
/// 本插件支持的CAD版本
/// </summary>
public String[] m_CADsupport = { "2007.dll", "2010.dll", "2012.dll", "2013.dll", "2014.dll", "2016.dll", "2018.dll", "2019.dll", "2020.dll", "2022.dll", "2023.dll" };
/// <summary>
/// CAD二次开发_加载外部参照dll的名字
/// </summary>
public static string CAD = "XattachGEDI";
/// <summary>
/// 动态库名
/// </summary>
public String m_dllName;
/// 默认安装路径
/// </summary>
public String m_setUpPath = @"D:\GEDI\DocWatch";
下面为安装函数:
/// <summary>
/// 在默认位置安装所有版本的插件
/// </summary>
public void installer()
{
//获取本电脑上所有安装的CAD版本
getAllCADVersion();
//安装程序集类型
m_dllName = CAD;
//获取CAD安装版本库
bool hasCopiedFiles = false; //创建一个标识, 表明是否复制了文件, 默认值为假
List<string> m_allVersion_Name = new List<string>(); //用户电脑上安装的所有CAD版本的列表
List<string> version_installSuccessfully = new List<string>(); //插件安装成功的CAD版本
List<string> version_installFailed = new List<string>(); //插件安装失败的CAD版本
if (m_allVersion == null || m_allVersion.Count == 0)
{
string err = "该电脑未安装AutoCAD,请先安装!";
MessageBox.Show(err, "提示");
logger.LogError(err);
return;
}
//遍历安装所有用户电脑上的各种CAD版本
foreach (string regVerson in m_allVersion)
{
//MessageBox.Show("注册表项字符串:" + regVerson, "注册表项字符串");
string versionName = GetVersion(regVerson); //通过注册表项获取版本名
if (versionName == "")
{
string errorStr = "通过注册表项获取AutoCAD版本名失败, 本插件暂不支持此版本! 请联系开发人员进行版本兼容。 \n注册表项字符串为:" + regVerson;
MessageBox.Show(errorStr, "提示");
logger.LogError(errorStr);
continue; //跳过以下代码
}
m_allVersion_Name.Add(versionName);
//MessageBox.Show("版本名称:" + versionName, "版本名称");
string versionYear = versionName.Split(' ')[1].Substring(0, 4); //通过版本名称获取年号
string versionDll = m_dllName + versionYear + ".dll"; //通过年号获取到 dll全名
//MessageBox.Show("dll全名:" + versionDll, "dll全名");
bool isSupportedVersion = false;
//将通过注册表获取到的dll文件与本插件支持的版本进行匹配, 检查生成的dll文件是否在支持的版本列表 m_CADsupport中
foreach (String str in m_CADsupport)
{
//如果文件名字与支持的版本匹配成功
if (m_dllName + str == versionDll)
{
isSupportedVersion = true;
break;
}
}
if (!isSupportedVersion)
{
string err = "插件暂不支持此版本" + versionName + "\n请复制当前CAD版本安装目录中的文件\n【AcCui.dll】【acdbmgd.dll】【acmgd.dll】【accoremgd.dll(若没有可忽略)】\n提交给开发人员进行兼容!";
//MessageBox.Show(err, "提示");
logger.LogError(err);
continue; //跳过不支持的版本,下面的文件复制和加入注册表的代码不执行
}
//如果没有复制过,则复制bin文件夹下的所有文件
if (!hasCopiedFiles)
{
//复制dll资源到指定安装目录
if (!System.IO.Directory.Exists("bin"))
{
string err = "当前安装目录下的安