找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1113|回复: 19

[求助]:masterhe 斑竹,如何进行封装库和反编译?

[复制链接]
发表于 2005-5-3 18:11:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
我正在学.NET,看了您的贴子,很想知道如何封装库和反编译源代码。期待您的指导,先谢谢了!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2005-5-3 18:53:51 | 显示全部楼层
要是能反编译出源代码,谁还费劲去写程序,呵呵
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-5-3 20:31:47 | 显示全部楼层

Re: [求助]:masterhe 斑竹,如何进行封装库和反编译?

最初由 ahlzl 发布
[B]我正在学.NET,看了您的贴子,很想知道如何封装库和反编译源代码。期待您的指导,先谢谢了!! [/B]


目前常用的工具是:
Reflector和Remotesoft,以前还有一个开源的Anakrino。
其中最好用的是Remotesoft,能够直接反编译出源文件。别的工具只能反编译出类和各个方法,不是直接生成源文件。

从理论上说,只要是.NET做的都能反编译出源代码,但是如果编程者对成品(dll或exe)做了obfuscated的话,反编译出来时不太好阅读。比如以下是Autodesk.AutoCAD.DatabaseService.Line的部份源代码:

  1. [Wrapper("AcDbLine")]
  2.         public class Line : Curve
  3.         {
  4.                 // Methods
  5.                 public Line();
  6.                 public Line(Point3d pointer1, Point3d pointer2);
  7.                 protected internal Line(IntPtr unmanagedObjPtr, bool autoDelete):base(unmanagedObjPtr,autoDelete)
  8.                 {
  9.                 }
  10.                 internal AcDbLine* GetImpObj()
  11.                 {
  12.                         return (AcDbLine*)(UnmanagedObject.ToPointer ());
  13.                 }

  14.                 // Properties
  15.                 public override Point3d EndPoint
  16.                 {
  17.                         get
  18.                         {
  19.                                 return base.EndPoint;
  20.                         }
  21.                         set
  22.                         {
  23.                                 GetImpObj()->setEndPoint(AcGePoint3d(value[0],value[1],value[2]));
  24.                         }
  25.                 }
  26.                 public override Vector3d Normal
  27.                 {
  28.                         get
  29.                         {
  30.                                 AcGeVector3d vectord1=GetImpObj()->normal();
  31.                                 Vector3d vectord2 = new Vector3d(vectord1[0],vectord1[1],vectord1[2]);
  32.                                 return vectord2;
  33.                                                         }
  34.                         set
  35.                         {
  36.                                 GetImpObj()->setNormal(AcGeVector3d(value[0],value[1],value[2]));
  37.                         }
  38.                 }
  39.                 public Vector3d Normal { get; set; }
  40.                 public override Point3d StartPoint
  41.                 {
  42.                         get
  43.                         {
  44.                                 return base.StartPoint;
  45.                         }
  46.                         set
  47.                         {
  48.                                 GetImpObj()->setStartPoint(AcGePoint3d(value[0],value[1],value[2]));
  49.                         }
  50.                 }
  51.                 public double Thickness
  52.                 {
  53.                         get
  54.                         {
  55.                                 return GetImpObj()->thickness();
  56.                         }
  57.                         set
  58.                         {
  59.                                 GetImpObj()->setThickness(value);
  60.                         }
  61.                 }
  62.         }
复制代码


但是如果经obfuscated就会有点变化,我提供的两个库是没有做obfuscated的。
以下作过obfuscated的示例:

  1. obfuscated前
  2. private void OnButtonClick(object sender,EventArgs e)
  3. {
  4.     this.DoIt(sender,e);
  5. }
  6. obfuscated后:
  7. private void x5186dc31139c9704(object xe0292b9ed559da7d, EventArgs xfbf34718e704c6bc)
  8. {
  9.       this.x9c658d57fb451412(xe0292b9ed559da7d, xfbf34718e704c6bc);
  10. }


论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-5-3 21:31:42 | 显示全部楼层
非常感谢masterhe斑竹耐心的指导!
这反编译源代码对我来说还难了一点,masterhe斑竹能否再辛苦一下,说一下如何封库。您在http://www.xdcad.net/forum/showthread.php?s=&threadid=362187 中封装的两个DLL,是怎么做出来的?教教我好吗!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-5-3 22:00:11 | 显示全部楼层
由于你的.NET基础有点薄弱,那咱们就从最简单的方法开始说吧:
1、安装VS.NET 2002
2、安装ObjectARX 2006 Wizard
3、按下图建新项目
4、开始玩儿
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-5-3 22:14:41 | 显示全部楼层
谢谢!
我现在的水平:知道建类库(用VB。NET或C#),能画出一些基本图元。
看斑竹的介绍,是要用VC++。NET来封装吗?!我装的是.NET2003,ObjectARX 2006 Wizard装不上(这问题也要请斑竹想想方法),用VB。NET或C#能封装库吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-5-3 23:07:56 | 显示全部楼层
请仔细看看截图,那是一个C#工程。
VS.NET 2003在这个问题上和VS2002一样的。能安装2006Wizard。
如果实在没装上Wizard,可以建个类库(因为你现在已会),然后将acdbmgd.dll和acmgd.dll作为引用添加上,然后就OK了。
另外一个建议,别用VB.net那破玩意儿,VB.net2002和VB.net2003的语法就不少差别,C#才是正宗玩.NET的语言,另外偶尔用用VC++.net做一些C#做不到的事。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-5-4 16:56:43 | 显示全部楼层
再一次感谢masterhe 斑竹十分耐心的讲解!
那个截图我看了,我觉得由于我装不上2006Wizard,所以,“AutoCAD Manared CS Project”这一项我就没有!我现在是不是首先要解决安装2006Wizard的问题?

这两个贴子,麻烦masterhe 斑竹看看:
http://www.xdcad.net/forum/showthread.php?threadid=369575
http://863s.com/list.asp?unid=143
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-5-4 17:07:01 | 显示全部楼层
啊,我点击“Continue”安装上去了,不知道功能是否正常。正在摸索!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-5-5 08:21:25 | 显示全部楼层
863S上的文章和我们现在要讨论的话题无关。
我的机器上有VS98/2002/2003,安装2004/2005/2006Wizard时都能自动安装到VS2002和2003,没有出现过你所述问题。
安装不上没关系,对于.NET开发ACAD,Wizard所做的事主要有两个:
1、添加前述两个dll的引用
2、自动将调试的可执行文件ACAD.EXE做好设置
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-5-6 13:07:19 | 显示全部楼层
多谢指导!
masterhe 斑竹能否给一段示范C#代码:封装一个类:MyCircle,,能继承Circle类所有的方法和属性,并增加一个由两点为直径画圆的方法!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-5-6 13:53:00 | 显示全部楼层
对于使用自定义(代理)实体,只能用VC++做,这和原来没有区别。然后用VC++.net去封装供.NET(VC++.NET、C#、VB.NET、Delphi.NET etc.)调用。
不知道你会不会用VC++作代理实体,如果不会,接下来没法作。
另外,虽然863S上有文章说可以用VS2003开发ARX,但最好还是用VS2002,MFC版本的变化,不是说能将库链接上就OK的。
多说一句,很多朋友模糊了VC++和VC++.NET的概念,其实这是两个东东,只是这两个东东可以混编程序而已。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-5-6 18:16:01 | 显示全部楼层
http://www.xdcad.net/forum/showthre...threadid=362187 中封装的两个DLL是用VC搞出来的!
完了,VC++我现在一点也不会!
我是想今后在VC、ARX和.NET上下下功夫,不会的内容太多了!
还有一个问题:现在用.NET开发出来的东东只能用于CAD2006,能否让VBA、LISP调用.NET的DLL,使其他版本的CAD也能用上!我现在只能让CAD2006的VBA调用.NET(这没意义了)……
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-5-6 19:07:16 | 显示全部楼层
那两个Dll一个是VC++.net作的,一个是C#作的。
目前使用的2006的.NET API做出来的东东,只能运行于CAD2006,但可以被VBA和VLISP调用。
由于兼容性,我相信如果想在CAD2007上使用,只需调整一下引用路径,然后再重新编译一下就可以了。

这么给你解释一下吧:

我们知道ARX是不向下兼容的,ADESK只作到部份向上兼容:
ARX2000可以运行于 CAD2000/2002
ARX2004可以运行于 CAD2004/2005/2006
如果用到新版功能,反之不能成立。

我们的.NET程序机制是这样的:
.NET程序->.NET API->ObjectARX
所以不可能向下兼容。
另外.NET程序还有版本问题,这个就不多讲了,参见MSDN。

还有一个很重要的概念要告诉你:
如果不自己做新的代理对象(自定义实体),VC++一点不会没有关系,C#能很好做ACAD二次开发。这是进入ACAD二次开发领域一个非常好的契机,很多人没有意识到这一点,希望你能好好把握。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-5-6 19:27:27 | 显示全部楼层
对masterhe  斑竹的指导,再一次表示感谢!我会努力的……
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-16 13:31 , Processed in 0.209668 second(s), 60 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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