前面的文章已经介绍过,通过修改注册表可以实现.NET程序集随AutoCAD的启动自动加载,这两天Kean又介绍了一种程序化的加载方法:用.NET程序加载.NET程序集,用到了微软的核心类库mscorlib中的System.Reflection命令空间。加载时只要一个函数Assembly.LoadFrom()可以了,试了下速度还是很快地。下面转一下Kean的测试代码(C#): 1 using Autodesk.AutoCAD.ApplicationServices;
2 using Autodesk.AutoCAD.EditorInput;
3 using Autodesk.AutoCAD.Runtime;
4 using System.Reflection;
5 namespace LoadModule
6 {
7 public class Commands
8 {
9 [CommandMethod("MNL")]
10 static public void MyNetLoad()
11 {
12 Document doc =
13 Application.DocumentManager.MdiActiveDocument;
14 Editor ed = doc.Editor;
15 PromptStringOptions pso =
16 new PromptStringOptions(
17 "\n输入要加载的程序集全路径: "
18 );
19 pso.AllowSpaces = true;
20 PromptResult pr = ed.GetString(pso);
21 if (pr.Status != PromptStatus.OK)
22 return;
23 try
24 {
25 Assembly.LoadFrom(pr.StringResult);
26 }
27 catch (System.Exception ex)
28 {
29 ed.WriteMessage(
30 "\n无法加载程序集{0}: {1}",
31 pr.StringResult,
32 ex.Message
33 );
34 }
35 }
36 }
37 }
此方法给用户随时后台(不知不觉地)加载.NET程序集提供了一种可能,美中不足的是托管的程序集目前只能加载无法卸载,一次加载终身受用,直到你关闭AutoCAD为至,呵呵。
另一种用LISP加载.NET的程序集的方法由来已久。思路是用lisp语言程序化调用“Netload”命令,代码也比较简单,速度也还可以,示例如下: (defun cundefinedOADNET()
(command "netload" "E:/documents/DotNetFile.dll")
(command "LOADNET")
(princ)
)
如果要加载的*.dll文件中正好也有一个名为"LOADNET"的目标命令,那么当第一次输入"LOADNET"命令时,程序会先netload那个dll文件,然后执行其中定义的"LOADNET"目标命令;接下来再输入"LOADNET"命令时,程序会“忽略”lisp的命令,进而执行dll文件中定义的"LOADNET"目标命令。这从表面看起来有点儿像“唤醒加载”,其实偶感觉每运行一次命令,CAD都要加载一次dll程序集,还是有差别的。 小结一下: (1)这两种加载方法都可以实现dll程序的批量后台加载;
(2)这两种加载方法在执行之前都要先加载原始的命令文件(第一种要加载主dll程序,第二种要先加载一下主lisp程序);
(3)这两种方法加载后的dll程序同样无法进行“卸载”,直到你关了AutoCAD;
(4)相比较来讲,偶更倾向于用注册表来控制.NET程序集的加载,因为反正无法卸载,还不如我一开始都把文件给加载全了,而且通过注册表还可以实现真正的“唤醒加载”方式。
|