乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 153|回复: 9

再试COM与.NET结合(测试源码)

[复制链接]

16

主题

53

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
117
发表于 2010-6-1 11:47:00 | 显示全部楼层 |阅读模式
.NET就只能做dll嵌入CAD使用,也学习了kean的专题,为了在我目前的CS程序中能够实现多版本,并且使用.NET技术。
总结如下:
1 C#无法做标准COM组件
2 用.net开发的dll(假设叫Com1.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转为接口!但是如果这个类的这个方法是自己的,不是继承接口的,就不会报错。


本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

72

主题

2726

帖子

9

银币

社区元老

Rank: 75Rank: 75Rank: 75

铜币
3014
发表于 2010-6-1 20:39:00 | 显示全部楼层
总结的不错,呵呵
当然,能附上测试的项目最好
不过,总的感觉,用C#做Com调用,也许真的很复杂,用VBNet也许会方便点?
回复

使用道具 举报

16

主题

53

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
117
发表于 2010-6-1 21:47:00 | 显示全部楼层

毕竟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了。

th1tgnf445x.jpg

th1tgnf445x.jpg


yf1hxfxggu5.jpg

yf1hxfxggu5.jpg


3optiggay4q.jpg

3optiggay4q.jpg


lidpvu0fqo5.jpg

lidpvu0fqo5.jpg

回复

使用道具 举报

1

主题

113

帖子

6

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
117
发表于 2010-6-3 10:14:00 | 显示全部楼层
能否提供Tools.Acad.dll和Tools.Excel.dll
回复

使用道具 举报

16

主题

53

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
117
发表于 2010-6-4 00:03:00 | 显示全部楼层
Tools.Acad.dll和Tools.Excel.dll 是作为商业产品的一部分,无法提供。也是我辛苦2个星期才想到和作出来的。
思路很简单的:仿照excel的一个com库,cad的两个com库,对照excel和cad对象模型图,逐个的反射所有类的方法,属性,索引器。
excel简单一些,cad复杂一些。
回复

使用道具 举报

1

主题

113

帖子

6

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
117
发表于 2010-6-4 08:26:00 | 显示全部楼层
感谢gsteven提供思路
回复

使用道具 举报

7

主题

55

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
83
发表于 2010-6-7 21:43:00 | 显示全部楼层
支持了。我向楼主学习
回复

使用道具 举报

4

主题

19

帖子

2

银币

初来乍到

Rank: 1

铜币
35
发表于 2011-10-31 20:31:00 | 显示全部楼层
谢谢提供思路!
回复

使用道具 举报

1

主题

3

帖子

1

银币

初来乍到

Rank: 1

铜币
7
发表于 2014-3-5 16:39:00 | 显示全部楼层
对于第2条有些疑问,好像C#的dll不必放到AutoCAD的安装目录中吧,因为当CAD加载了DLL后,这个dll的当前运行目录应该就是cad的目录了,它可以自动找到所引用的dll的。
回复

使用道具 举报

89

主题

410

帖子

8

银币

中流砥柱

Rank: 25

铜币
766
发表于 2014-3-9 14:28:00 | 显示全部楼层
可以肯定的是,楼主的这种做法在全世界也算是先进的。
我查了Autodesk Developer Network DevBlog,kean's blog, theswamp forum都没有 这么搞的。
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-14 13:16 , Processed in 0.414975 second(s), 77 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表