|
|

网上看了许多工具,可以把dll打包到exe程序里面,但是,如果,把dll打包到exe程序中,
有的打包软件,会有问题,如果,再加壳的话,估计,问题更大了,
我想有什么方法,可以把dll一起打包到exe中呢????突然,我想到嵌入式资源。
如图,我把dll都改成了嵌入的资源了:
这样就可以了吗??no,当然不可以。
- /// <summary> 载入资源中的动态链接库(dll)文件
- /// </summary>
- static class LoadResourceDll
- {
- static Dictionary<string, Assembly> Dlls = new Dictionary<string, Assembly>();
- static Dictionary<string, object> Assemblies = new Dictionary<string, object>();
- static Assembly AssemblyResolve(object sender, ResolveEventArgs args)
- {
- //程序集
- Assembly ass;
- //获取加载失败的程序集的全名
- var assName = new AssemblyName(args.Name).FullName;
- //判断Dlls集合中是否有已加载的同名程序集
- if (Dlls.TryGetValue(assName, out ass) && ass != null)
- {
- Dlls[assName] = null;//如果有则置空并返回
- return ass;
- }
- else
- {
- throw new DllNotFoundException(assName);//否则抛出加载失败的异常
- }
- }
- /// <summary> 注册资源中的dll
- /// </summary>
- public static void RegistDLL()
- {
- //获取调用者的程序集
- var ass = new StackTrace(0).GetFrame(1).GetMethod().Module.Assembly;
- //判断程序集是否已经处理
- if (Assemblies.ContainsKey(ass.FullName))
- {
- return;
- }
- //程序集加入已处理集合
- Assemblies.Add(ass.FullName, null);
- //绑定程序集加载失败事件(这里我测试了,就算重复绑也是没关系的)
- AppDomain.CurrentDomain.AssemblyResolve += AssemblyResolve;
- //获取所有资源文件文件名
- var res = ass.GetManifestResourceNames();
- foreach (var r in res)
- {
- //如果是dll,则加载
- if (r.EndsWith(".dll", StringComparison.OrdinalIgnoreCase))
- {
- try
- {
- var s = ass.GetManifestResourceStream(r);
- var bts = new byte[s.Length];
- s.Read(bts, 0, (int)s.Length);
- var da = Assembly.Load(bts);
- //判断是否已经加载
- if (Dlls.ContainsKey(da.FullName))
- {
- continue;
- }
- Dlls[da.FullName] = da;
- }
- catch
- {
- //加载失败就算了...
- }
- }
- }
- }
- }
复制代码
把这个类复制到项目中,然后,在main方法注册dll,我是winform程序,
代码如下:
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
LoadResourceDll.RegistDLL();
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Login());
}
最后,搞定了!!!生成了一个exe文件。
|
上一篇:c#通过调用Win32 API函数清楚浏览器缓存和cookie下一篇:asp.net管理员或者用户登录超过5次,关闭浏览器登录
|