日期:2014-05-18  浏览次数:20862 次

总结一下程序集加载方法,同时一个防止反汇编的问题。
更详细的请访问http://blog.csdn.net/podded/archive/2008/10/27/3158687.aspx 。
   
  要从程序集的元数据中获取程序集的信息,首先需要加载程序集。.Net中加载程序集方法有几种,本人结合自己的实践和认识简单介绍一下。描述不一定很准确,请提出来一起进步。

一、隐式加载
  没有被显式加载但被引用的程序集,CLR会按照全局程序集缓存(GAC)、工作目录(应用程序所在目录)以及私有路径目录的顺序来寻找并加载。

二、AppDomain.Load 方法
  将一个程序集加载到一个特定的程序域中,主要用来供非托管代码调用。

三、Assembly.Load方法
  通过接受一个程序集标识来加载程序集。如果是强命名程序集,则标识包括程序集名称、版本、语言文化、以及公有密钥标记,Load方法将导致CLR按照隐式加载的策略寻找并加载程序集。弱命名程序集则只是一个不带文件扩展名的程序集的名称,CLR不会到GAC中查找,如果没有指定私有目录,则在工作目录查找。其中私有目录的定义可以在配置文件中指定。

四、Assembly.LoadFrom方法
  参数是包括程序集清单的文件的名称或路径,包括文件扩展名。如需要加载D:\App\math.dll,可以使用语句:
  Assembly a = Assembly.LoadFrom(@"D:\App\math.dll");
  a即是加载的程序集。
  但这种方法有缺点,在MSDN上有详细的描述,我自己遇到的一个问题是加载一个在非工作目录下的程序集后,在另一个程序集中使用这个程序集中的对象进行反序列化时失败。

五、Assembly.LoadFile方法
  用来加载指定路径上的程序集文件的内容。使用 LoadFile 方法来加载和检查具有相同标识但位于不同路径中的程序集。与 LoadFrom 不同,LoadFile 不会将文件加载到 LoadFrom 上下文中,也不会使用加载路径解析依赖项。LoadFile 在这个受限制的方案中很有用,因为 LoadFrom 不能用于加载标识相同但路径不同的程序集;它只加载第一个这样的程序集。

六、Assembly.LoadWithPartialName方法
  使用部分名称从应用程序目录或从全局程序集缓存加载程序集。参数为程序集标识,其中包含程序集的名称(不带文件扩展名)。程序集的版本、语言文化及公用密钥标记为可选。该方法执行时CLR首先检查应用程序的XML配置文件来搜索qualifyAssembly元素,若存在则该元素应能告诉CLR如何将一个部分的程序集标识映射为完全限定的标识,CRL将根据通常规则来查找程序集。若该元素不存在,CRL将使用指定名称在应用程序的工作目录和私有路径目录中搜索。若仍未找到,则到GAC中查找。

七、传统VC动态库的调用
  通过 P/Invoke 调用Win32 DLL

  using System.Runtime.InteropServices;//这是用到DllImport时候要引入的程序集

  [DllImport("DBAccess.dll",CharSet=CharSet.Auto)]
  static extern ulong FindApp( bool bIsTrue );
  //声明外部的标准动态库,跟Win32API是一样的.

问题:
 如何防止程序集被反汇编编译?除了使用干扰工具,有什么设置或代码限制可以防止?

谢谢!
 

------解决方案--------------------
总结得不错,我也学习一下,
------解决方案--------------------
mark
------解决方案--------------------
没办法,连号称最好的maxtocode混淆器网上都有破解方法
------解决方案--------------------
看过,又忘记了。。
再看,再忘。。。。
等用的时候再来查把。。。