如何防止网络文学抄袭别人抄袭自己的.NET组件代码

(青春敷衍的年華)
(青春敷衍的年華)
(青春敷衍的年華)
(青春敷衍的年華)
(青春敷衍的年華)
第三方登录:2016年10月优秀大版主2016年8月优秀大版主
2016年9月 总版技术专家分月排行榜第二
2007年6月 总版技术专家分月排行榜第三
2007年6月 VC/MFC大版内专家分月排行榜第一
2015年11月 扩充话题大版内专家分月排行榜第一2015年7月 扩充话题大版内专家分月排行榜第一2015年1月 扩充话题大版内专家分月排行榜第一2014年9月 扩充话题大版内专家分月排行榜第一(补)2013年9月 扩充话题大版内专家分月排行榜第一2013年8月 扩充话题大版内专家分月排行榜第一2013年7月 扩充话题大版内专家分月排行榜第一
2016年3月 扩充话题大版内专家分月排行榜第二2015年12月 扩充话题大版内专家分月排行榜第二2015年6月 扩充话题大版内专家分月排行榜第二2015年2月 扩充话题大版内专家分月排行榜第二2014年10月 扩充话题大版内专家分月排行榜第二2014年8月 扩充话题大版内专家分月排行榜第二
2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
2007年6月 总版技术专家分月排行榜第三
2007年6月 VC/MFC大版内专家分月排行榜第一
2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
2007年6月 总版技术专家分月排行榜第三
2007年6月 VC/MFC大版内专家分月排行榜第一
2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
2007年6月 总版技术专家分月排行榜第三
2007年6月 VC/MFC大版内专家分月排行榜第一
2007年6月 总版技术专家分月排行榜第三
2007年6月 VC/MFC大版内专家分月排行榜第一
2007年6月 总版技术专家分月排行榜第三
2007年6月 VC/MFC大版内专家分月排行榜第一
2007年6月 总版技术专家分月排行榜第三
2007年6月 VC/MFC大版内专家分月排行榜第一
2007年6月 总版技术专家分月排行榜第三
2007年6月 VC/MFC大版内专家分月排行榜第一
2007年6月 总版技术专家分月排行榜第三
2007年6月 VC/MFC大版内专家分月排行榜第一
2007年6月 总版技术专家分月排行榜第三
2007年6月 VC/MFC大版内专家分月排行榜第一
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。Dotnet是一种建立在虚拟机上执行的语言,它直接生成&MSIL&的中间语言,再由DotNet编译器&JIT&解释映象为本机代码并交付CPU执行。它和Java是一种机制的语言。这种语言的优点就是您不需要去考虑您的程序在那里运行,您只需要把功能做出来,虚拟机会在任何地方实现您的功能。这是一个很好的趋势和想法,但虚拟机的中间语言由于带了大量的&元数据metadada&信息,所以也极容易被反编译。
Dotnet的保护分为三大类
由ms&提供的非第三方保护方案
a)&&&&&&&&&&&&强名称
强名称是MS提供的保护机制。
它需要使用&sn&这个命令。
强名称是什么意思呢?在这里稍作解释。强名称的作用就是防止程序集被非法修改,当对程序集修改后,必须重新用您的私钥再对程序集加一次强名称,这也是如果含有强名称的程序集在混淆或加密后必须要重新加强名称的原因。
Sn / ?&可以看到它的使用方法,如果你安装的&Framework是中文的,那么参数的解释也是中文的,我就不多讲了。
那么强名称有用吗?网上轻松破解强名称的方法很多,Ildasm反编译加过强名称的程序集后,在IL文件中将强名称的相关信息去掉,再利用Ilasm编译,就可以解除强名称的限制了。强名称的PublcKey不管是加在程序集中,还是加在Class中,都可以被去掉,所以强名称不是一个完善的保护方式。
使用StrongNameIdentityPermissionAttribute类
这个类允许你将组件(或类、方法)与某一强名称(通常就是你发布程序时所用的强名称)绑定,这样,只有在客户端程序具有该强名称签名的情况下才能使用你的组件。也就是说,除了你自己编写的客户端代码因为拥有同样的签名而被允许使用组件以外,任何第三方代码都无法通过StrongNameIdentityPermissionAttribute的防护,因此也就无法恶意调用你的组件了。
为了简便起见,先创建一个很简单的Class Library项目,代码如下:
&// SecureComp.dll
&namespace musicland
&&&public class SecureComp
&&&public string Confidential()
&&&return "This is confidential!";
首先引入System.Security.Permissions命名空间:
&using System.Security.P
&然后,在组件级加上StrongNameIdentityPermissionAttribute属性:
&[assembly: StrongNameIdentityPermissionAttribute(SecurityAction.RequestMinimum,
PublicKey="7d&+&d12ba7ded27d89d1330ccedae8a0e7ecd857f8&+&126db3cab6fcbf2afb4b475c537703efb96e17ee022b22f3d772f14&+&6a3a5c7f6ccad5ecc3ca1c8b610afc0feb8e6993ab1")]
&namespace musicland
注意,这里使用了SecurityAction.RequestMinimum,这申明除非获得StrongNameIdentityPermissionAttribute所表明的资源访问权限(即对SecureComp.dll组件的访问权限,可以把SecureComp.dll看作一样资源),否则CLR不会准许调用方(即客户端代码)访问所请求的资源;此外,在PublicKey属性中加入了你所允许的公匙(Public Key)的十六进制表示(转化成字符串类型)。CRL在运行期间将依照这一段公匙来判断调用方是否合法,除非调用方拥有相应的私匙(Private Key),否则将无法访问。看来,平时一定要倍加保护你的密钥文件,因为密钥文件(特别是private key)的泄露将会成为你无尽恶梦的根源,而延迟签名(delay signing)在这里也就显得格外重要了
通过Sn.exe工具就可以把PublicKey给提取出来。打开命令行,定位到密钥文件所在目录并输入以下内容:
sn &p Key.snk PublicKey.snk
这样,提取出来的公匙信息就被存储在PublicKey.snk文件中。你现在只需使用Secutil.exe把公匙信息读取出来并转化成适当的格式就可以了。
b)&&&&&&&&编译MSIL为本机代码(误区?)
关于这一点,我经常能在MS上的社区看到有MVP这样面对问题:
问:C#写的程序能编译成本机代码吗?
答:可以,使用&Ngen.exe&即可以&MSIL&代码编译为 本机代码。
MVP这样回答错了吗?其实,严格的说,MVP的回答是没错的,Ngen.exe的确是可以将&MSIL&编译为本机代码,并可以使JIT不需要进行再次编译MSIL。这样能加快程序的执行效率。
但用户这样的问题其实,并不是对执行效率不满意,而是对中间语言不满意,可惜&Ngen&并不能解决用户的问题。
让我们来浅浅的分析一下&Ngen的工作吧。
Ngen是MS提供的 本机映象生成器,它可以将中间语言程序集编译为本机代码存放在缓存中。这里请大家注意,是存放在缓存中,Dotnet在内存中建立了一个缓存,这个缓存中存放了许多常用的程序集编译后的本机代码,它们是常驻的,由此来加快Dotnet的执行速度。
所谓一个本机代码,因为本机映射时,会映射出一些&Framework&里需要的Method,编译为汇编就是&Call 0x0200000这样的样子,而这些东西必须是事件编译好的。那么理论上说&Ngen&必须要在当前执行的机器上运行,而直接编译成本机代码的程序copy到另一个地方不一定可以用。Ngen.exe&只是一个提速的工具,因为要执行编译为本机代码必须还是要原程序集,而原程序集中存在MSIL,所以让程序无法脱离被反编译的目地。
以上是ms提供的工具,下在讲讲,自己在编程的过程中,如何使用技巧来防止破解或反编译。
编程技巧保护方案
在这里,我会给大家介绍两种三种方式
1.&&&&&&&人为混淆
混淆顾名思意,就是混乱,不明确的意思。MetaData中都有一个Rid,程序集运行时就已经和名称没什么关系了,都使用Rid来调用的,所以可以将名称省去。
什么叫人为混淆呢,就是人为的制造混淆。
曾经看过一个程序集,手工的将一个Method折成几十个或上百个,从而达到让你看不懂的目的。不过可惜的说一句:现在的Dotnet程序集的分析工具都很强大,正引用,反调用都可以用程序来实现,所以即实这么做,了没多大用处。著名的Reflector就有这些功能。
2.&&&&&&&隐藏程序集
刚刚谈到了Reflector,它就是使用这种方式来隐藏自己的核心程序集的。相信我,Reflector并不是您看到的那一个可执行程序,它的可执行程序只是一个壳而以,里面是一个定义和接口,没有实例的方法。如果你想得到他是怎样反编译的核心,恐怕你会在它这个迷宫中迷失方向。
它的核心程序集事实上就是它的一个资源。而这个资源是一个加密的资源。他应该是在双击第一个需要反编译的Method的时候开始释放这个资源,并对资源解密然后动态的加载。这样做的优点核心程序集是不会在硬盘上留下任何痕迹的,它只解在内存中解密并被加载,你基本上无法得到这个程序集。而且Dotnet是不允许内存&Dump的。
大家是不是觉得这种保护方法不错呢?你可以把你的核心代码加密后做成资源包在程序里,在使用的时候再解密出来,这只需要你自己去实现就可以了。
不过我还得说句负责任的话,如果你有精力,并且很有耐心和技术,相信你还是可以在几天时间内找出它的核心程序集解密算法的位置。并成功的解出它的资源程序集。
如果是高手又非常有经验,这种方式的加密手段应该是秒杀。
3.&&&&&&&将程序集中的相关Method(方法)编译成Unmanaged(非托管代码)
下面介绍的内容无法得到核心代码
它可称之为终极的保护手段,因为它就是&非托管代码&。
什么是托管代码,什么是非托管代码。
托管代码就是基于.net元数据格式的代码,运行于.net平台之上,所有的与操作系统的交换有.net来完成,就像是把这些功能委托给.net,所以称之为托管代码。非托管代码则反之。
下面要介绍的方式就是如何在自己的程序集中即拥有托管代码,又拥有非托管代码。注意,非托管代码是无法被现在的反编译工具反编译的。
&&&&在Dotnet程序集中,允许托管代码和非托管代码共存,怎样实现呢?这并不是无偿的,这是需要条件的。它的条件就是必须使用VC++.NET非托管方式来写dll,再用VC++托管方式建立工程引入这个本机代码的dll。最终生成一个Dotnet程序集的dll。那么这个程序集里面即有托管代码,又有非托管代码。托管代码是可以反编译的,而非托管代码不可能被反编译。
&&&&有人可能要问了,这和自己用VC++写个dll有什么区别?区别就是这样的结合更紧密一些,而且也不能用常规的分析Asm的工具去分析这个dll。
写注册算法,并生成dll供给Dotnet程序集调用,防止破解。其实这句话只说对了一半,这只能增加破解注册机的难度,并防止不了破解。为什么呢?因为注册对不对还是要在Dotnet程序集中进行判断,所以,只要改掉这个判断,一样达到了破解效果。但是如果要分析注册算法,那可就是困难了一些了。
第三方保护工具
第三方保护工具较好的厂商有:
1.&&&&&&&Aiasted.SOFT&&&&&&&
a)&&&&&&&&&产品 :MaxtoCode&,种类 :加密、混淆
2.&&&&&&&PerEmptive Solutions&&&&&
a)&&&&&&&&&产品 :Dotfuscator Community&,种类 :混淆
3.&&&&&&&Remotesoft
a)&&&&&&&&&产品 :Remotesoft Protect&,种类 :加密
b)&&&&&&&&产品 :Remotesoft Dotfuscator&,种类 :混淆
4.&&&&&&&XenoCode
a)&&&&&&&&&产品 :XenoCode&,种类:混淆
第三方工具的保护方式分类
这是目前最流行的方式吧。今天我们就来做个剖析。让大家去衡量一下混淆的强度如何。
混淆软件一般都有三个功能
1.字符串加密
字符串加密可以分为两类,第一类是混淆保护中的字符串加密技术。主要特征是修改代码执行路径。大部分混淆保护工具的字符串加密都是这一类。
加密前:&MessageBox.Show("Hellow World!");
加密后:&MessageBox.Show(Helper.Decode("A34579dfbbeyu/=="));
第二类就是加密壳中的字符串加密技术。这种不用修改IL代码,直接对元数据中的字符串加密。这一类以remotesoft,maxtocode为代表。
实现就是直接对元数据中的String流进行加密,这类保护有一个缺陷,程序运行后 元数据中的String流会解密后在内存中完整还原。
2.名称混淆
最简单的混淆是名称混淆,即将命名空间名、类名、方法名、字段名等统统换成特殊符号或其它符号,目的就是让你不能与以前的名称建立关联。达到把你弄糊涂的目地。
比方如下代码所示:
public class Register //&一个注册类
public bool IsRegistered() //&判断是否已注册的方法
这样的代码在程序编译后,名称完全被保留,但如果经过名称反混淆以后,它将变成这样:
public class a //&一个注册类
{ public bool a() //&判断是否已注册的方法
我们现在深入的谈谈它的优点:
名称混淆,如果使用短名称及不可见字符,将会缩小程序集的大小
名称混淆,因为名称混淆也只能骗骗门外汉和小孩
那么它有什么缺点呢?
名称混淆的缺点并不多,只有一个,而且非常致命,这就是有时候,当修改了类名之后不能执行的问题。
一般来说,这种情况在&DLL&身上发生的更多,但在&EXE&身上也经常发生。
因为&DLL&的某些&Public&方法是对外的结口,在程序开发和调试的时候使用的源名称,当混淆以后,天知道把这些方法改成了什么名称,所以调用肯定报错。处理办法:不混淆对外提供的&Public&方法
EXE&和&DLL&还有一个共同的容易出错的地方就是资源,混淆器也可以混淆资源名称,这样,就存在的同样的问题――&无法找到资源而报错(动态&Load&资源的时候)&,处理方法:不混淆程序内部调用的东西。
3.流程混淆
原理基本上是一样,即把方法中的代码分为几段,并把每一段都错开,然后利用&跳转&语句连接原来的流程逻辑,并达到执行正确的目地。原理图如下表所示:
块编号 块代码
1&第一个功能
2&第二个功能
3&第三个功能
4&第四个功能
块编号 块代码跳转
1&第一个功能&Jmp 2
4&第四个功能
3&第三个功能&Jmp 4
2&第二个功能&Jmp 3
基本流程混淆原理即是上表所示,总结就以下这么几个字:破坏原有程序结构,并利用Jmp语句接连原有流程。
如果你要手工混淆你的代码,你需要做以下几件事:
&把源代码分成几块
&把这么几块的顺序打乱
&用&br.s&对这几块的顺序进行连接,并保护执行达到原来的逻辑
&重新计算行号
这样,你就能拥有自己的流程混淆了。如果你加入真真假假的逻辑跳转来混淆,强度将会更大。
&名称混淆 - 反混淆
名称混淆反混淆,基本上是不太可能的事,因为以前的名称已经换掉了,也没有第二个名称备份表,所以根本无法还换。
不过,可以把不可见字符转换为可见字符,长字符串换成短字符串。
有两种方法可以做处理:
&在&MetaData&中有一个区域叫做&_STRING&它存放了所有名称字符串,只要修改这里的内容,即可,此方法需要对元数据结构特别熟悉
&如果你对元数据不了解,没关系,你可以用&ILDasm&把混淆后的程序集反编译,然后一个一个的对应改过来,再用&ilAsm&编译,一样可以达到反混淆的作用
&流程混淆 - 反混淆
流程混淆,在上面已经给出例子。它才是有用的一种混淆方式。它改变流程的存放序顺,从而达到静态反编译的功能。(名称混淆还是可以反编译)
不过,不管怎样,他没有办法去阻止读取&IL&,这就是流程混淆的天生不足。反流程混淆也相当的容易,只要按照执行流程加入特定的条件即可以得到代码的序顺。
阅读(...) 评论()
网站:http://www./查看: 22242|回复: 59
ExcelDna项目:如何封装和保护Excel文件里面的公式及VBA代码,防止被抄袭和非授权外流
阅读权限100
在线时间 小时
本帖已被收录到知识树中,索引项:
本帖最后由 liucqa 于
08:17 编辑
& && &&&通常来说,在Excel开发方面,很多人都有着保护劳动成果不被他人随意修改和任意流传的需求。无论这种需求是出于对数据结果正确性的考虑,还是出于对知识产权保护的考虑,我们都需要找到一种方便易用,开发迅速的简便方法。
& && &&&对大多数普通群众来说,能否保护工作表中的公式不被使用者看到,是一个令人挠头的问题。
& && &&&而对VBA开发者来说,从VBA出现的那天起,如何保护VBA代码就更是一个永恒的话题。
目前我们已知的方法:& && &&&
保护工作表公式
1、简单的办法是设置工作表密码--------很容易破解
2、使用VBA替代--------只能保护数据的正确性,依然面临代码暴露问题
保护VBA代码
1、共享工作簿或者设置工程密码--------很容易破解
2、使用宏表-------面临代码暴露问题
3、使用Excel95------不推荐,后继开发问题太多
4、代码混淆(例如VBASafe)------意义不大
5、利用Excel bug使设置了工程密码的VBA代码不可见,有相应工具---------不过这种保护是可逆的
6、阿吉的几种方法,参见(可能要 翻 墙 看),这个帖子系统讲解了Excel的各种保护技巧,值得学习。其中的复合文档模块隐藏方法(可以用UltraEdit简单操作实现)比较有价值,不过不利于代码的后期维护。同时也很容易被某工具直接提取出VBA代码。
例子参见:
7、使用工具加壳打包为Exe文件--------存在临时文件释放问题,使用文件监视器即可轻易破解
从目前实践的情况来看,如果要同时考虑代码安全和后期维护问题,上述几种方法都不可取。
因此,采用DLL、XLL封装就成了保护Excel文件中的公式和代码不被暴露的唯一选择,也是可长期持续发展的选择。我推荐有一定.Net基础的人采用XLL方式开发,最大的好处是不需要安装包!分发问题解决了!!
另一个问题在于:我们要找到一种类似VBA开发快捷程度的快速开发的工具,这样才能利用简单的知识快捷开发和封装文件。
本文不对如何封装的具体代码进行讨论,那样要写厚厚的一本书才行。
本文会推荐论坛中的一些帖子,以及接合本人在开发中的一些实际经验,来与大家交流封装技术。
欢迎大家参与讨论,互相学习
讨论的内容分三个部分:
1、VB 6.0的DLL封装
2、VSTO开发(程序级、文档级、加载宏)
3、.Net下的XLL开发(Excel-DNA项目)
******************************************************************************
俺认为,要想保护你在工作表之中的函数公式不被公开,开发成本最低,操作也最简单的唯一办法是:
原理看10楼介绍
******************************
开发office应用的难易程度:
易& &&&--------------------------------------------------------------------------------------&& && &&&难
VBA& && &.DNA(txt)& && & DNA(VS C#/VB)& && & VSTO(VB/C#)& && &VB(dll)& &&&C++(dll / xll)
所以我觉得Excel DNA项目还是很有前途的。对付普通的VBA应用基本没问题了,不过还是需要使用者有C#基础(最好懂一点C API)
阅读权限100
在线时间 小时
本帖最后由 liucqa 于
23:06 编辑
VB 6.0的DLL封装
先给新手解释几个问题:
1、什么是封装:
一言以蔽之,封装就是用高级编程语言(VB、C、C++、.net等)重新写代码,以达成VBA相同的功能,并确保能够被Excel直接使用。
2、封装一定要使用DLL方式吗?
不一定,VBA除了可以像调用API一样调用自己开发的DLL中的函数外,还可以使用Com加载宏,或者调用外部COM对象(使用CreatObject)。
另外,Excel本身也能够调用XLL,或者直接使用VSTO开发的应用。
3、为什么要封装:
为了保护代码和公式。因为采用第三方工具编写的代码,在生成DLL、COM、XLL之后,代码是加密的,除了专业人士很难破解(.net开发的dll例外,需要混淆后再加壳打包)。对于保护我们自己的应用功能来说,这种程度的加密,已经完全足够了。
下面是论坛的一些帖子,系统的讲解了如何使用VB 6.0做DLL封装
关于VB6.0的封装,论坛已经有很多帖子,本文不再涉及。
无论是使用C、C++、VB6.0哪一个语言来开发DLL,VBA开发者都要学习很多新的知识,容易望而生畏。此外,采用DLL开发Ribbon菜单的难度较大,因此微软不推荐使用这种方法来代替VBA开发。
如果您想从VBA转入专业Excel应用开发的话,建议使用VSTO或者XLL。
阅读权限100
在线时间 小时
本帖最后由 liucqa 于
15:05 编辑
1、先解释一下什么是VSTO
VSTO:Microsoft Visual Studio Tools for the Microsoft Office System。是一个在Visual Studio下开发Office应用的工具。需要安装VS、2010等环境
2、什么是Office 主互操作程序集 Microsoft Office PIAs
PIAs:Office Primary Interop Assemblies是用来使应用程序能够访问Office功能的一个程序集,包括
Microsoft.Office.Interop.Excel.dll
Microsoft.Office.Interop.Outlook.dll
Microsoft.Office.Interop.PowerPoint.dll
Microsoft.Office.Interop.Word.dll
开发VSTO应用,需要用到这个程序集。
3、VSTO可以开发哪些应用
如果你安装了VS2010,可以开发程序级别、文档级别和外接加载宏应用
推荐在VS2010+.Net 4.0环境下开发,具体原因不在这里细说。
&&文档级别的例子
&&加载项的例子
从实践的情况来看,通过VSTO开发Excel应用,具有功能强大,部署方便的特点。
但其劣势也很明显:普通使用者无力学习如此复杂的开发环境及开发语言,这直接造成了VSTO推广困难,只能在专业的程序员和企业内部中大型开发中得到应用。
能不能找到一种方便个人开发者使用的简便工具呢:
我把目光转向了XLL加载宏。早期的XLL加载宏只能使用C++来开发,难度大。自从Excel-DNA项目发布0.3版之后,我终于找到了一个可以快速开发XLL加载宏的工具。
阅读权限100
在线时间 小时
& & & & & & & &
本帖最后由 liucqa 于
15:53 编辑
开发XLL加载宏
1、什么是XLL加载宏?
XLL加载宏其实就是一种特殊的DLL,在这个DLL中,实现了 xlAutoFree,&&xlAutoAdd,&&xlAutoOpen,&&xlAutoClose,&&xlAutoRemove,&&xlAutoRegister,&&xlAddInManagerInfo等一些函数,以便Excel可以识别,并加载。由于XLL就是DLL的一个特例,因此具备相当强度的保密性(XLA加载宏是没有代码保密功能的)。
2、XLL加载宏能做什么?
几乎可以完成VSTO所能完成的全部工作,但是由于不具备VS开发环境里面的Ribbon图形化设计功能,如果需要做界面的话,需要事先设计XML文本,并通晓一些回调的知识。
3、XLL加载宏如何加载和管理?
可以使用Excel打开,或者用VBA代码加载,甚至也可以用一个XLL加载另一个XLL(可以实现自动Update功能)。注销也可以通过Excel、VBA、或者代码实现
4、如何开发XLL加载宏?
早期通过C/C++语言开发,具体见下帖
http://blog.csdn.net/wxy6285/article/details/3255673
由于使用C++开发困难较大,不适合VBA开发者,因此,我建议通过Excel-DNA项目来完成XLL的开发。
阅读权限100
在线时间 小时
本帖最后由 liucqa 于
15:53 编辑
Excel-DNA介绍,第一个例子
1、什么是Excel-DNA
这是一个开源项目,可以使用户方便的通过.Net语言来开发XLL加载宏。
开发方式分为两种,可以直接通过编辑.dna文件来快速开发,也可以通过VS2010工程来进行DLL开发。两个方式最终都可以打包成为XLL,但只有后者提供代码安全性。如果需要彻底的保护文件的话,还需要使用签名工具给打包之后的XLL文件做上数字签名以保证文件不会被篡改。
官方网址:http://excel-dna.net/
最新版本是0.30---------日发布,下载网址/releases/view/95861
2、一个使用dna文件来运行XLL加载宏的例子
第一步,在示例中找到.dna文件,并用记事本写入函数。例子里面已经写好了。
第二步,双击运行ExcelDna.xll文件,这个文件会自动调用.dna文件中的函数,加载到Excel里面(如果是64位的机器,双击运行ExcelDna64.xll)
第三步,在工作表中使用这个函数
从使用过程中,可以看到通过dna文件来建立XLL加载宏中的自定义函数,操作非常的简便。省去了用C++开发的一大堆代码。ExcelDna.xll会替你做这些工作。
在.dna文件中编辑函数的方法,与VBA开发者习惯的操作没什么不同,只不过不能调试而已。如果代码不复杂的话,完全可以直接在dna文件中书写。
开发速度快,是采用ExcelDna的最重要理由。
(322.79 KB, 下载次数: 402)
15:52 上传
点击文件名下载附件
阅读权限100
在线时间 小时
本帖最后由 liucqa 于
16:09 编辑
第二个例子:使用Excel-DNA开发XLL加载宏---Ribbon
1、什么是Ribbon
Ribbon是新的 Microsoft Office Fluent 用户界面 (UI) 的一部分,从Office2007开始支持。嗯,就是Excel最上面那个有着一大堆图标和文字的面板
2、如何开发Ribbon
开发Ribbon是一件比较麻烦的工作,网上有篇文章叫做“细品Ribbon功能区”,网址/index.php//ribbonxstudy6/,不了解Ribbon的人可以仔细看看。
对大部分人来说,开发Ribbon是一件心有余而力不足的事情,想在XLL里面开发Ribbon就更加遥不可及了。
理论上说,开发Ribbon的最佳工具是VSTO,因为其具备可视化的设计界面。但由于此工具不适合VBA的普通开发者,因此我建议还是通过某种方式得到用来设计Ribbon的XML代码,并通过Excel-DNA加入到你的XLL宏中。
具体例子:
安装之后的界面
(325.7 KB, 下载次数: 213)
16:08 上传
点击文件名下载附件
开发Ribbon是一件麻烦事,建议通过专业人士进行。普通的VBA开发者只要会抄代码就可以了{:soso_e113:}
阅读权限100
在线时间 小时
& & & & & & & &
本帖最后由 liucqa 于
16:22 编辑
第三个例子:使用Excel-DNA开发XLL加载宏---操作Excel
我们可以使用Excel-DNA的文件来生成加载宏和自定义函数,亦能操作Excel表格,完成VBA所能完成的大部分功能。
代码及例子
1、dna文件中的代码
2、运行ExcelDna.xll之后的效果
3、运行dna文件里面的函数
示例文件:
(323.12 KB, 下载次数: 238)
16:21 上传
点击文件名下载附件
阅读权限100
在线时间 小时
本帖最后由 liucqa 于
08:12 编辑
使用Excel-DNA开发XLL加载宏---打包.dna文件到XLL
嗯,为什么要打包呢?
目的是为了部署方便,你不能给使用者好多个文件去运行。打包成一个XLL文件就方便多了。
文档中的说明:
(419.03 KB, 下载次数: 186)
16:26 上传
点击文件名下载附件
需要注意的是,采用dna文件方式来开发XLL加载宏,并不能达到100%保密的效果,因为打包之后的dna文件依然是明码存在的。
要解决代码加密保护的问题,需要采用托管DLL方式开发,对不熟悉.net语言的人来说,虽然你依旧不必去考虑XLL的那7个接口函数,但还是复杂了一点。
因此,如果想彻底的保护你开发的工作表公式、VBA代码的话,学习.net语言还是很有必要的,至少比学习C++来开发XLL要容易多了。
阅读权限100
在线时间 小时
本帖最后由 liucqa 于
16:43 编辑
使用Excel-DNA开发XLL加载宏---使用VBA对XLL加载宏进行自动注册和反注册
由于很多用户不具备基本的操作能力,因此有必要提供一个在Excel文件打开的时候,自动加载XLL功能。当然,你也可以将XLL加载宏放到专门的目录中,由Excel在启动时自行加载,不过那样的话,就变成了程序级别的加载宏了。
下面给出通过VBA来自动注册和反注册XLL加载宏的代码
1、通过RegisterXLL(方式一)
’注册代码
Function LoadXll(XLLPath As String, XLLName As String) As Boolean
& & If (Application.RegisterXLL(XLLPath & XLLName)) Then
& && &&&LoadXll = True
& & Else
& && &&&LoadXll = False
& & End If
End Function
‘反注册代码
Application.ExecuteExcel4Macro (&UNREGISTER(&&& & ThisWorkbook.Path & Application.PathSeparator & LoadXLLName & &&&)&)复制代码2、通过Addins(方式二)
‘注册代码
Function LoadXllAddins(XLLPath As String, XLLName As String) As Boolean
& & Dim i&, index&
& & If Len(Dir(XLLPath & XLLName)) & 0 Then
& && &&&AddIns.Add Filename:=XLLPath & XLLName
& && &&&For i = 1 To AddIns.Count
& && && && &If AddIns(i).name = XLLName Then
& && && && && & index = i
& && && && && & Exit For
& && && && &End If
& && &&&Next
& && &&&AddIns(index).Installed = True
& && &&&LoadXllAddins = True
& & Else
& && &&&LoadXllAddins = False
& & End If
End Function
'反注册代码
Sub UnLoadXllAddins(XLLName As String)
& & Dim flag As Boolean
& & Dim i As Integer, index&
& & flag = False
& & For i = 1 To AddIns.Count
& && &&&If AddIns(i).name = XLLName Then
& && && && &index = i
& && && && &flag = True
& && && && &Exit For
& && &&&End If
& & Next
& & If flag Then AddIns(index).Installed = False
End Sub复制代码
方式一的保密性较好,用户不能在Excel的加载宏里面看到加载宏的名字(2007版),但反注册之后会在函数列表中残留XLL的函数名称(这是一个bug),需要通过在XLL中写入隐藏函数的代码来解决。
方式二没有残留函数问题,但注册和反注册之后,都能在Excel选项的加载宏里面看到XLL的名称。
个人推荐普通用户使用方式二,有能力写.net代码的采用方式一。
阅读权限100
在线时间 小时
本帖最后由 liucqa 于
22:31 编辑
使用Excel-DNA开发XLL加载宏---封装Excel自带的工作表函数和公式
嗯,费了半天力气,其实前面的内容都是为主题做扫盲的,现在终于谈到如何做保护Excel公式以及VBA代码封装的真正工作了{:soso_e112:}
俺认为,要想保护你在工作表之中的函数公式不被公开,开发成本最低,操作也最简单的唯一办法是:
在XLL文件中封装你在公式中用到的工作表函数,以及你的公式计算过程。
要保护VBA代码,也要在XLL中封装你的程序(其实就是重写代码)
这里暂时不谈如何重写VBA代码,重点探讨如何封装公式。
其实思路很简单,就是用另一个名字的函数,来实现与工作表函数相同的功能。问题的关键在于,我们不可能去重写工作表函数,那样的话,不如直接去微软上班了。
因此,我们要解决的问题就是,如何把调用工作表函数的参数传递给XLL,并在XLL内调用需要的WorkSheetFunction。
考虑本贴不是技术贴,论坛也不是.net论坛,我就不贴出详细的C#代码了,只说一下关键点:
1、获取xlCaller,这样就知道了调用函数时候的单元格位置
2、将形如=SUMIFS(A2:A11,B2:B11,C2:C11)里面的参数转成Range,这样才能传递给WorkSheetFunction。如果不转换的话,传递过来的参数是数组或者是引用。也可以用C API的函数来处理,不过在某些情况下API的bug会导致计算缓慢、死机和出错(2010会好些)。
3、将WorkSheetFunction返回的数值传递给调用函数
4、对错误的处理
5、要求.Net 4.0
如果有熟悉Excel-Dna和C#的会员感兴趣的话,欢迎QQ交流。
一些资料:
/index.php?option=com_content&view=article&id=92
*************************************************************************************************
这有个例子,,供大家参考!
*************************************
最后还是要说一句,使用.Net编程的最大弱点就是中间代码可以被反编译。
因此如果你对开发出来的.Net代码有非常强烈的保密要求的话,请使用混淆工具,并加壳(这都有专门的商业软件)。
Excel-DNA做出来的XLL并非是100%不可破解的(即使是用DLL打包),看看网络上90%的商业软件都有注册机各位就明白了。
使用这个工具,是为了提高开发速度和降低开发难度。若有特别需求,请换Dephi或者C/C++(非托管)代码开发(虽然也一样会被破解,但源码比较安全)。
*************************************
最新热点 /1
ExcelHome每周都有线上直播公开课,
国内一流讲师真身分享,高手贴身答疑,
赶不上直播还能看录像,
关键居然是免费的!
厚木哥们都已经这么努力了,
你还好意思说学不好Office。
玩命加载中,请稍候
玩命加载中,请稍候
Powered by
本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任! & & 本站特聘法律顾问:徐怀玉律师 李志群律师}

我要回帖

更多关于 设备 防止抄袭 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信