明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 8730|回复: 10

[运行时] 再试COM与.NET结合(测试源码)

  [复制链接]
发表于 2010-6-1 11:47:00 | 显示全部楼层 |阅读模式
本帖最后由 作者 于 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的acdbmgdacmgd不允许复制本地,而且要被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 2009AutoCADCom1.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)发现不行,因为acdbmgdacmgd没有强名。即使做成了也不行,因为.net的acdbmgdacmgd不允许复制本地,运行时肯定会出现加载acdbmgdacmgd失败

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 2009AutoCADCom1.dll被CAD给占用了,因为CAD不关闭,就不能删除它,而且只要一打开AutoCAD 2009,这个文件就不能删除了

11 附件是源代码,发现如果AutoCADCom1的Commands类继承了INumberAddition或者INumberAddition2接口,在运行接口对应的那个方法时就会报错,无法将COM_OBJECT转为接口!但是如果这个类的这个方法是自己的,不是继承接口的,就不会报错。

 

 

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

评分

参与人数 1威望 +1 明经币 +2 金钱 +20 贡献 +5 激情 +5 收起 理由
雪山飞狐_lzh + 1 + 2 + 20 + 5 + 5 【精华】好文章

查看全部评分

发表于 2010-6-1 20:39:00 | 显示全部楼层

总结的不错,呵呵

当然,能附上测试的项目最好

不过,总的感觉,用C#做Com调用,也许真的很复杂,用VBNet也许会方便点?

 楼主| 发表于 2010-6-1 21:47:00 | 显示全部楼层
本帖最后由 作者 于 2010-6-2 9:14:11 编辑

毕竟C#更加专业一些。

最近通过反射我已经实现了AutoCAD和Excel的com调用,我的CS程序直接引用我做的Tools.Acad.dll和Tools.Excel.dll就可以了,不再需要引用Excel和CAD的COM了,只要本机安装了CAD2000到2011的任何一个版本和Excel2000到2010的任何一个版本,都可以用。Tools.Acad.dll和Tools.Excel.dll就像Excel和CAD的使用方法就和com一样。目前只是实现了我常用的功能,还有大部分功能基本不用,就没去管它。都是因为客户版本从2004到2009都有人用,没办法,只能这么干,要不早就用.NET了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2010-6-3 10:14:00 | 显示全部楼层
能否提供Tools.Acad.dll和Tools.Excel.dll
 楼主| 发表于 2010-6-4 00:03:00 | 显示全部楼层

Tools.Acad.dll和Tools.Excel.dll 是作为商业产品的一部分,无法提供。也是我辛苦2个星期才想到和作出来的。

思路很简单的:仿照excel的一个com库,cad的两个com库,对照excel和cad对象模型图,逐个的反射所有类的方法,属性,索引器。

excel简单一些,cad复杂一些。

发表于 2010-6-4 08:26:00 | 显示全部楼层
感谢gsteven提供思路
发表于 2010-6-7 21:43:00 | 显示全部楼层

支持了。我向楼主学习

发表于 2011-10-31 20:31:23 | 显示全部楼层
谢谢提供思路!
发表于 2014-3-5 16:39:20 | 显示全部楼层
对于第2条有些疑问,好像C#的dll不必放到AutoCAD的安装目录中吧,因为当CAD加载了DLL后,这个dll的当前运行目录应该就是cad的目录了,它可以自动找到所引用的dll的。
发表于 2014-3-9 14:28:03 | 显示全部楼层
可以肯定的是,楼主的这种做法在全世界也算是先进的。
我查了Autodesk Developer Network DevBlog,kean's blog, theswamp forum都没有 这么搞的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 14:23 , Processed in 0.193137 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表