程序dll合并和取消合并[重复]
Posted
技术标签:
【中文标题】程序dll合并和取消合并[重复]【英文标题】:Program dll merge and unmerge [duplicate] 【发布时间】:2013-07-07 10:29:25 【问题描述】:我想知道如何在我的程序中压缩我的dll文件,然后在程序运行时从程序中提取文件以便程序可以使用它们,当程序关闭时,文件被压缩回来了。
【问题讨论】:
这是什么意思? DLL 文件真的太大吗? 您是否需要压缩 DLL,或者您只是想隐藏 DLL? @CodyGray 有 4 个 dll 约 4mb 的一块。我想要这种方式只是为了不使用文件夹,或者桌面上的文件太多。 所以我认为我们误解了您对“压缩”一词的使用,这意味着缩小某些东西以使其更小,而不是“合并”或“组合”或“包含”或“封装” " 等等。在这种情况下,ILMerge 就是您要找的。已经有lots of questions问about that here already。 经典 XY 问题。不可避免的 X 问题是在程序运行时您仍然在桌面上有 DLL。您可以通过将程序放在它们所属的位置(c:\program 文件目录)来解决 X。现在你不再关心 Y 了。 【参考方案1】:如果我理解正确,您希望隐藏您的 DLL。
第一种方式:
1) 将 DLL 作为资源包含在项目中 (exe) 2)实现这样的方法:
public static void ResourceToFile(string fileName, string dir, byte[] resource)
Directory.CreateDirectory(dir);
string path = Path.Combine(dir, fileName);
File.WriteAllBytes(path, resource);
3) 像这样调用:(在应用程序启动时,在使用 dll 之前)
ResourceToFile("xyz.dll", Application.StartupPath, Resources.xyzLib);
第二种方式: (不写入文件,仅适用于程序集)
您可以使用AppDomain.AssemblyResolve
事件,该事件在找不到 DLL 时触发。
使用上述方法从应用程序资源中加载程序集。
【讨论】:
【参考方案2】:您可以为此使用 ZipArchive 类。
【讨论】:
【参考方案3】:取自Jeffrey Richters blog。这将从您的程序资源中加载程序集,因此只需要运行可执行文件。
AppDomain.CurrentDomain.AssemblyResolve += (sender, args) =>
String resourceName = "AssemblyLoadingAndReflection." +
new AssemblyName(args.Name).Name + ".dll";
using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName))
Byte[] assemblyData = new Byte[stream.Length];
stream.Read(assemblyData, 0, assemblyData.Length);
return Assembly.Load(assemblyData);
;
【讨论】:
以上是关于程序dll合并和取消合并[重复]的主要内容,如果未能解决你的问题,请参考以下文章
清单合并失败:针对 Android 12 的应用程序 - Android Studio 错误 [重复]