本帖最后由 作者 于 2010-6-2 11:15:24 编辑
.NET就只能做dll嵌入CAD使用,也学习了kean的专题,为了在我目前的CS程序中能够实现多版本,并且使用.NET技术。
总结如下:
1 C#无法做标准COM组件
2 用.net开发的dll(假设叫AutoCADCom1.dll)必须位于CAD安装目录内,如C:\Program Files\AutoCAD 2009,因为.net的acdbmgd,acmgd不允许复制本地,而且要被AutoCADCom1.dll引用。
3 AutoCADCom1.dll必须在注册表中注册,使用RegAsm.exe注册,在C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727内,其中codebase项,如果CS程序也放在C:\Program Files\AutoCAD 2009,则不比填写,否则必填。不管CS程序目录内是否有AutoCADCom1.dll。
3 调用AutoCADCom1.dll的CS程序必须通过app.GetInterfaceObject(ProgID),app就是CAD应用程序,为了实现多版本,建立app建议使用反射,而不要去引用com库。
4 app.GetInterfaceObject(ProgID)可以返回object,然后全部使用反射实现AutoCADCom1.dll的每一个方法,如object ox.GetType().InvokeMember("AddNumbers", BindingFlags.InvokeMethod, null, ox, args);;也可以将AutoCADCom1.dll引用到CS程序,并且复制本地,app.GetInterfaceObject(ProgID)返回一个接口或者一个类,如返回接口,则类必须继承于该接口,如AutoCADCom1.class.AddNumbers(i, j)或者AutoCADCom1.interface.AddNumbers(i, j),
5 步骤4的后种方法实际上是,对象建立是用的C:\Program Files\AutoCAD 2009的AutoCADCom1.dll,而定义则使用复制本地的AutoCADCom1.dll,注意这两个dll一模一样的
6 CS程序安装的时候,可以将CS程序目录全部放在C:\Program Files\AutoCAD 2009,这样不需要注册codebase项,但这样不好吧,谁的程序不是单独建文件夹;
或者CS放其他文件夹,将其中的AutoCADCom1.dll复制到C:\Program Files\AutoCAD 2009,注册表可以自己往里面写,别忘了加上codebase项,也可以通过System.Diagnostics的process类使用RegAsm.exe来注册(方法网上可查)
7 本来想把AutoCADCom1.dll做成强名放入GAC,(这样不需要注册codebase)发现不行,因为acdbmgd,acmgd没有强名。即使做成了也不行,因为.net的acdbmgd,acmgd不允许复制本地,运行时肯定会出现加载acdbmgd,acmgd失败。
8 AutoCADCom1.dll作为工具性的类库,负责处理由CS程序发送的参数,并实现成图形。而不是只能作为dll导入cad,应该让他被其他程序应用,实现它的价值。
希望有人能够补充一下,我觉得这样开发.net太麻烦了,希望有好的方法。
刚才试验了一下,codebase不必填写(前提是CS程序中有它),只要C:\Program Files\AutoCAD 2009有AutoCADCom1.dll即可,没有就报错,这样也许会简单一些。
9 通过监视运行时的已加载程序集,发现在开始就加载了CS程序中的AutoCADCom1.dll,在通过反射建立CAD应用程序后加载了GAC的CADAutodesk.AutoCAD.Interop,
始终未加载C:\Program Files\AutoCAD 2009的任何程序集,但是C:\Program Files\AutoCAD 2009必须有AutoCADCom1.dll
10 同时查看发现C:\Program Files\AutoCAD 2009的AutoCADCom1.dll被CAD给占用了,因为CAD不关闭,就不能删除它,而且只要一打开AutoCAD 2009,这个文件就不能删除了
11 附件是源代码,发现如果AutoCADCom1的Commands类继承了INumberAddition或者INumberAddition2接口,在运行接口对应的那个方法时就会报错,无法将COM_OBJECT转为接口!但是如果这个类的这个方法是自己的,不是继承接口的,就不会报错。
|