程序的注册表写到HKLM下,所以第一次加载需要用管理员权限打开cad。
主要函数:
1# ====
'''
''' 提取当前程序集所有注册的命令信息
'''
'''
Private Shared Function GetCueentAssemblyCmd() As Dictionary(Of String, List(Of String()))
Dim listCmd As Dictionary(Of String, List(Of String())) = New Dictionary(Of String, List(Of String()))
Dim currentAss = Assembly.GetExecutingAssembly()
Dim ed As Editor = Application.DocumentManager.MdiActiveDocument.Editor
'ed.WriteMessage(currentAss.FullName + Environment.NewLine)
For Each typeItem As Type In currentAss.GetTypes()
If typeItem.IsClass And typeItem.IsPublic Then
For Each method As MethodInfo In typeItem.GetMethods()
If method.IsPublic And method.GetCustomAttributes(True).Length > 0 Then
For Each att As Object In method.GetCustomAttributes(True)
If att.GetType().Name = GetType(CommandMethodAttribute).Name Then
Dim att_CommandMethod As CommandMethodAttribute = att
If listCmd.ContainsKey(typeItem.Name) Then
Dim dicTemp = listCmd(typeItem.Name)
dicTemp.Add(New String() {method.Name, att_CommandMethod.GlobalName})
listCmd(typeItem.Name) = dicTemp
Else
Dim listTemp As List(Of String()) = New List(Of String())
listTemp.Add(New String() {method.Name, att_CommandMethod.GlobalName})
listCmd(typeItem.Name) = listTemp
End If
End If
Next
End If
Next
End If
Next
Return listCmd
End Function
2#
'''
''' 将自定义的命令组合成菜单的形式
'''
'''
Private Shared Sub AddMenuBartoAutoCAD(listCmd As Dictionary(Of String, List(Of String())))
Dim acadApp As AcadApplication = Application.AcadApplication
Dim currentAssName = Assembly.GetExecutingAssembly().ManifestModule.Name.Substring(0, Assembly.GetExecutingAssembly().ManifestModule.Name.Length - 4)
For index = 0 To acadApp.MenuGroups.Item(0).Menus.Count - 1
Dim mg As AcadPopupMenu = acadApp.MenuGroups.Item(0).Menus.Item(index)
If mg.Name = currentAssName Then acadApp.MenuGroups.Item(0).Menus.Item(index).RemoveFromMenuBar()
Next
Dim mg_menuBar As AcadPopupMenu = acadApp.MenuGroups.Item(0).Menus.Add(currentAssName)
For Each item As KeyValuePair(Of String, List(Of String())) In listCmd
Dim submenu = mg_menuBar.AddSubMenu(mg_menuBar.Count + 1, item.Key)
For Each cmd As String() In item.Value
submenu.AddMenuItem(submenu.Count + 1, cmd(0), cmd(1) + " ")
Next
Next
mg_menuBar.InsertInMenuBar(acadApp.MenuBar.Count + 1)
End Sub
3#
'''
''' 写入注册表到HKLM
'''
Private Shared Sub DllAutoLoader()
Dim regPath As String = HostApplicationServices.Current.RegistryProductRootKey.Replace("Software", "SOFTWARE") 'Software\Autodesk\AutoCAD\R18.0\ACAD-8001:804
Dim ed As Editor = Application.DocumentManager.MdiActiveDocument.Editor
Dim assName = Assembly.GetExecutingAssembly().CodeBase
Dim apps_Acad = Registry.LocalMachine.OpenSubKey(Path.Combine(regPath, "Applications"), False)
Dim counts = apps_Acad.SubKeyCount, flag As Boolean = False
For Each item As String In apps_Acad.GetSubKeyNames()
If item = Path.GetFileNameWithoutExtension(assName) Then flag = True
Next
If flag = False Then
Dim autocad_App As RegistryKey
autocad_App = Registry.LocalMachine.OpenSubKey(Path.Combine(regPath, "Applications"), True) 'RegistryKeyPermissionCheck.ReadWriteSubTree, RegistryRights.FullControl
Dim myNerLoader = autocad_App.CreateSubKey(Path.GetFileNameWithoutExtension(assName), RegistryKeyPermissionCheck.Default)
myNerLoader.SetValue("DESCRIPTION", "加载自定义dll文件", Microsoft.Win32.RegistryValueKind.String)
myNerLoader.SetValue("LOADCTRLS", 2, Microsoft.Win32.RegistryValueKind.DWord)
myNerLoader.SetValue("LOADER", assName, Microsoft.Win32.RegistryValueKind.String)
myNerLoader.SetValue("MANAGED", 1, Microsoft.Win32.RegistryValueKind.DWord)
Application.ShowAlertDialog(Path.GetFileNameWithoutExtension(assName) + "程序自动加载完成,重启AutoCAD 生效!")
Else
Application.ShowAlertDialog(Path.GetFileNameWithoutExtension(assName) + "程序已经启动!欢迎使用")
End If
End Sub
4# 利用初始
Public Class MainClass
Implements IExtensionApplication
Public Sub Initialize() Implements IExtensionApplication.Initialize
Dim listCmd As Dictionary(Of String, List(Of String())) = GetCueentAssemblyCmd()
Call DllAutoLoader() 'Dll 自动加载设置
Call AddMenuBartoAutoCAD(listCmd) '利用反射插入菜单
End Sub
end class
public static List GetDllCmds(params string[] dllFiles)
{
List res = new List();
List cmds = new List();
#region 提取所以的命令
for (int i = 0; i t.IsClass && t.IsPublic).ToList();
if (clsCollection.Count > 0)
{
foreach (var cls in clsCollection)
{
var methods = cls.GetMethods().Where(m => m.IsPublic && m.GetCustomAttributes(true).Length > 0).ToList();
if (methods.Count > 0)
{
foreach (MethodInfo mi in methods)
{
var atts_CmdString = mi.GetCustomAttributes(true).Where(c => c is CommandMethodAttribute).ToList();
var atts_HelpString = mi.GetCustomAttributes(true).Where(c => c is CmdHelperAttribute).ToList();
if (atts_CmdString.Count == 1 && atts_HelpString.Count == 1)
{
gcadCmds cmd = new gcadCmds(cls.Name, mi.Name, (atts_CmdString[0] as CommandMethodAttribute).GlobalName,
ass.ManifestModule.Name.Substring(0, ass.ManifestModule.Name.Length - 4), (atts_HelpString[0] as CmdHelperAttribute).HelpContent, (atts_HelpString[0] as CmdHelperAttribute).IcoFileName);
cmds.Add(cmd);
}
}
}
}
}
}
#endregion
if (cmds.Count > 0)
{
List dllName = new List();
foreach (var item in cmds) if (!dllName.Contains(item.dllName)) dllName.Add(item.dllName);
foreach (var item in dllName) res.Add(new gcadDllcmd(item, cmds));
}
return res;
//
}
public static void AddCmdtoRibbon(List cmds)
{
RibbonControl ribbon = ComponentManager.Ribbon;
if (ribbon != null)
{
foreach (var dll in cmds)
{
RibbonTab rtab = ribbon.FindTab(dll.DllName);
if (rtab != null) ribbon.Tabs.Remove(rtab);
rtab = new RibbonTab()
{
Title = dll.DllName,
Id = dll.DllName,
IsVisible = true
};
//Add the Tab
ribbon.Tabs.Add(rtab);
//added the panels
foreach (var item in dll.clsCmds)
{
RibbonPanelSource rps = new RibbonPanelSource() { Title = item.clsName };