东莞企业网站seo,wordpress 多用户 域名,阿里wordpress镜像源码,网站开发前台软件用什么文章目录 前言详细实操简要步骤 前言
有没有想自己开发的exe保留一点神秘#xff0c;不想让他人知道软件使用了哪些dll; 又或许是客户觉得一个软件里面的dll文件太多了#xff0c;能不能简单一点#xff0c;直接双击.exe就可以直接运行了#xff0c;别搞那么多乱七八糟的。… 文章目录 前言详细实操简要步骤 前言
有没有想自己开发的exe保留一点神秘不想让他人知道软件使用了哪些dll; 又或许是客户觉得一个软件里面的dll文件太多了能不能简单一点直接双击.exe就可以直接运行了别搞那么多乱七八糟的。无论是主动还是被动这就产生了一个需求如何将软件调用的dll嵌入到exe中呢
详细实操
接下来介绍一下方法亲测有效已用于实际项目中。
我比较喜欢的方式是将软件的所有功能都已完成好了最后再做这个dll嵌入功能。
1 、将需要用到的dll添加的项目的引用中 可以看到dll的【复制本地】默认值是True, 在做嵌入dll功能时我们需要将【复制本地】值设置为False.
2、在项目中创建一个文件夹用于存放用到的dll比如我这里创建了MyDll的文件夹将项目中用到的所有dll都放这里了。 鼠标右键选中文件夹【MyDll】–选择【添加】—【现有项】—选择所有文件将文件夹下的Dll全部添加到工程中。 将MyDll文件下的所有文件属性【生成操作】选择嵌入的资源
3 重要的一步是动态加载dll的代码部分了。 新建一个类LoadDll用于映射解析dll. 其中InsertDllForm.MyDll是工程的命名空间文件夹名称需要自行替换为自己工程下的名称哈。 class LoadDll{public static void LoadResourceDll(){AppDomain.CurrentDomain.AssemblyResolve new ResolveEventHandler(CurrentDomain_AssemblyResolve);}private static System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args){string assName new AssemblyName(args.Name).Name;string resName InsertDllForm.MyDll. assName .dll;using (var stream Assembly.GetExecutingAssembly().GetManifestResourceStream(resName)){if (stream null){return null;}Byte[] assemblyData new Byte[stream.Length];stream.Read(assemblyData, 0, assemblyData.Length);return Assembly.Load(assemblyData);}}}4、最后一步在Main函数入口调用加载dll的函数。 LoadDll.LoadResourceDll();
static class Program{/// summary/// 应用程序的主入口点。/// /summary[STAThread]static void Main(){Application.EnableVisualStyles();//加载解析嵌入的DllLoadDll.LoadResourceDll();Application.SetCompatibleTextRenderingDefault(false);Application.Run(new MainForm());}}简要步骤 1 添加引用将需要用到的dll添加的项目的引用中并设置属性【复制本地】为False 2 将引用放到一个文件夹下并将里面的dll添加到工程设置属性【生成操作】为嵌入的资源 3 使用反射Reflection编写代码加载Dll的功能 4 主函数Main()调用加载Dll的功能 LoadResourceDll 结构如图。
测试项目运行如图所示。