|
- <ul type="1" class="litype_1"><li></li><li>using namespace System;</li><li>using namespace System::Windows::Forms;</li><li>using namespace Autodesk::AutoCAD::Runtime;</li><li>using namespace Autodesk::AutoCAD::ApplicationServices;</li><li></li><li>//本地代码部分,该部分编译以后不能通过反编译</li><li>#pragma unmanaged</li><li>int Add(int a,int b)</li><li>{</li><li>return a+b;</li><li>}</li><li>//托管代码部分,该本分可以通过反编译</li><li>#pragma managed</li><li>namespace ObjectArxTest</li><li>{</li><li>void CommandClass::MyCommd()</li><li>{</li><li>doit(4,6);</li><li>}</li><li>void CommandClass::doit(int a,int b)</li><li>{</li><li>if (Add(a,b)==10)</li><li>{</li><li>MessageBox::Show("测试成功!");</li><li>}</li><li>}</li><li>}
- </li></ul>
复制代码
Net中的编译文件容易被各种工具反汇编,原代码得不到保护,更容易被破解,一直是Net应用中的一个软肋。就我应用中摸索的一点体会,提供给大家分享。
在Net中,只有C++.net可以实现混编,其他语言则无能为力。
实现混编以后,在最终生成的托管代码中,可以嵌入X86本地代码,这样,即使被人反编译,本地代码部分也是看不到的,实现了关键算法的保密,可以隐藏了程序代码中的敏感部分,是喜欢Net编程人员自我保护的可选方案!我也是初步探索,希望同行们多多研究,互相交流。
首先,你需要了解C++建立Net程序的基础知识,能建立一个简单的ObjectARX项目,这个SDK中自带的向导不支持,需要你手工建立。其实很简单,在VS2005中,新建-项目-C+++-CLR-类库,然后点完成就可以了。
其次,你要添加对SDK中Net类库的引用,在项目属性中,选择 通用属性-应用,点击添加新引用,然后加入必须的那两个文件,复制本地属性分别设置为false。
最后就是添加代码了:
例如我建立项目的时候,项目名称定义为:ObjectArxTest
那么在ObjectArxTest.h中添加代码:
- <font color="rgb(102, 102, 102)"><font><ul type="1" class="litype_1"><li></li><li></li><li>using namespace System;</li><li>using namespace System::Windows::Forms;</li><li>using namespace Autodesk::AutoCAD::Runtime;</li><li>using namespace Autodesk::AutoCAD::ApplicationServices;</li><li>namespace ObjectArxTest</li><li>{</li><li>public ref class CommandClass</li><li>{</li><li>public:</li><li>[CommandMethod("test")]</li><li>static void MyCommd();</li><li>static void doit(int a,int b);</li><li>};</li><li>}
- </li></ul><div>
- </div>
- </font></font>
- <font>在ObjectArxTest.cpp中添加下面代码</font>
- <font color="rgb(102, 102, 102)"><font><ul type="1" class="litype_1"><li></li><li></li><li>using namespace System;</li><li>using namespace System::Windows::Forms;</li><li>using namespace Autodesk::AutoCAD::Runtime;</li><li>using namespace Autodesk::AutoCAD::ApplicationServices;</li><li></li><li>//本地代码部分,该部分编译以后不能通过反编译</li><li>#pragma unmanaged</li><li>int Add(int a,int b)</li><li>{</li><li>return a+b;</li><li>}</li><li>//托管代码部分,该本分可以通过反编译</li><li>#pragma managed</li><li>namespace ObjectArxTest</li><li>{</li><li>void CommandClass::MyCommd()</li><li>{</li><li>doit(4,6);</li><li>}</li><li>void CommandClass::doit(int a,int b)</li><li>{</li><li>if (Add(a,b)==10)</li><li>{</li><li>MessageBox::Show("测试成功!");</li><li>}</li><li>}</li><li>}
- </li></ul>
- <i>复制代码</i></font></font>
复制代码
现在可以编译了,用netload命令加载入CAD2008以后,运行命令test,是不是弹出来一个对话框?成功了!
其中代码中#pragma unmanaged与#pragma managed可以写入自己要防止反编译的函数,在后面的命名空间中可以直接调用,但编译以后这部分代码是受保护的。
|
|