如果我是用三层结构写的,那肯定就可能逻辑层和数据层DLL被别人拿去引用在.NET 1.1中用
http://gxh973121.cnblogs.com/archive/2006/05/26/409648.html
的方法可以实现,可到了.net 2.0 中,就不起作用了。

解决方案 »

  1.   

    ms-help://MS.MSDNQTR.2003FEB.2052/cpguide/html/cpconworkingwithstrongly-namedassemblies.htm
      

  2.   

    逻辑层和数据层DLL多用来定义元数据
    尽量定义结构和接口,不要实现
    实现部分在服务器和客户端写,可以防止业务逻辑被盗窃
      

  3.   

    大家理解错我意思了,我不是说的源代码保护,这个可以买第三方加密软件加密,别人就不能反编译出你的代码了。我现在说的是不让别个引用我的DLL, 像在工程中,你点 “引用”。
    这样,就可以直接用我的方法了。TO:luofix(luofix) 
    逻辑层和数据层DLL多用来定义元数据
    尽量定义结构和接口,不要实现
    实现部分在服务器和客户端写,可以防止业务逻辑被盗窃如果我做的是网站呢,全部代码都给了对方。
    在1.1中能成功的保护,就是我给的地址http://gxh973121.cnblogs.com/archive/2006/05/26/409648.html
    大家可以看看,但在了.NET 2.0中就不奏效了,不知道是不是因为2.0版本的原因,还是修改了方式。
      

  4.   

    层与层间的dll文件,可以被恶意调用,你可以把层与层间做个密钥接口呀,只用成功登录了,调用方法才好用
      

  5.   

    在DLL中获取程序集的名称,只有是你自己的程序集才往下执行,否则就直接抛异常。更狠的就是故意返回一些错误数据
      

  6.   

    vosov(ask a favor of wind...) 
    全部用internal,不要用public全部用internal的话,我怎么去访问呢。生成多个DLL那种。CodeAnyWhere(随风飘散) 
    层与层间的dll文件,可以被恶意调用,你可以把层与层间做个密钥接口呀,只用成功登录了,调用方法才好用我现在说的就是这种方法,但奇怪的是,.NET 1.1中测试成功,但在.NET 2.0中就不行。不信你们也试试看,通过的希望给个回复,谢谢
      

  7.   

    微软脑子烧坏了,因为2.0里面,运行在完全受信任环境下的代码是忽略一切安全检查的,就是说CAS不再对完全受信任代码起任何作用,CAS一旦发现调用方是完全受信任代码,则放弃一切安全机制。换言之,除非你能让调用方不具备完全受信任的条件,否则你就没法保护自己的代码。我也正为这个头疼。
      

  8.   

    即使是自己写Permission也不行,因为CAS直接忽略完全受信任的代码。
      

  9.   

    试试MaxtoCode,可以引用,但看不到任何信息,所以即使被引用也没什么关系,代码全被转移到本地的DLL中。
      

  10.   

    CAS 检查对 .Net 程序执行性能的影响很明显,微软为了 .NET 不会因为性能问题被他人诟病,所以过于草率地在技术上作出了如此唐突的决策。害我只能继续使用 1.1 了。
      

  11.   

    TO winxieddd(一剑飘香):就是不想被人引用啊。
      

  12.   

    好办好办
    既然微软不实现,那么我们自己实现好了。
    贴主所引用的1.1的StrongNameIdentityPermissionAttribute方式,实际上就是微软用CLR来检测调用方的强名称引用。既然微软在2.0里面去掉了这个功能,那么我们自己实现好了。即
    自己建立一个Attribute,方式可以是方法/类之类的,如public sealed AssemblyCallCheckAttribute : Attribute
    {
        // 检查代码
    }在检查代码里使用System.Reflection名称空间的Assembly类
    Assembly call = Assembly.GetCallingAssembly();
    上面代码的含义是获取调用当前方法的程序集。就是假设你的程序集AssemblyName.ClassName.MethodName() 方法被另一个程序集调用,则上面的GetCallingAssembly()方法获取的就是另一个程序集的引用。然后用Assembly的实例方法GetName()获取一个AssemblyName类的实例。而这个AsseblyName实例包含的就是程序集的信息,如程序集文件名,版本,和最重要的强名称信息,代码如下AssemblyName name = call.GetName();
      

  13.   

    接上:AssemblyName 有两个很重要的方法就是:
    AssemblyName.GetPublicKey() 和
    AssemblyName.GetPublicKeyToken()上面的两个方法从字面上就可以获得它的含义。获取了以后,就可以判断了。
    如自己写的所有的程序集固定使用一个专用的强名称文件,然后通过Reflector或ILDASM等软件获取自己的签名强名称的PublicKey或PublicKeyToken,保存在(可以加密保存)资源活着其他什么地方,运行的时候写一个算法随机检测调用的程序集是否是自己的程序集,如果是,则什么问题都没有,如果不是,那么抛出异常的方法谁不会?
      

  14.   

    使用特性(Attribute)声明式的安全检查,必须要有一个类似 CAS 的机制才有用的。单单设置 AssemblyCallCheckAttribute 有何用?写一个辅助的工具类,然后在需要的时候以命令式的方式进行调用检查,倒是好方法,值得采用。
      

  15.   

    使用CAS有两个好处
    1、拦截调用进行检查,CAS可以在CLR处拦截对代码的调用进行安全检查,很显然我们自己的检查机制必须自行在所有要检查的地方进行拦截。
    2、权限缓存,一旦CAS判定某个调用具备有效的权限,那么在下次同样调用时CAS将不会再进行安全检查,这是提高效率的一个方法,很显然我们根本没办法用到这个好处,所以会导致代码运行效率降低。
      

  16.   

    To AhBian(阿扁) :谁说Attribute必须要CAS必须的支持?那原来的NUnit怎么做到的?不也是利用特性的原理建立一个[Text]特性?原理是把代码写在特性里面,直接引用。