程序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 错误 [重复]

Git合并提交[重复]

Excle如何将多个同ID的值,合并到一个单元格内,并以逗号隔开

使用熊猫循环合并大量csv文件[重复]

fastreport 合并重复值单元格?

合并/合并几个PDF文件[重复]