将dll文件与wpf合并为一个单独的.exe文件

13 浏览
0 Comments

将dll文件与wpf合并为一个单独的.exe文件

我目前正在进行一个项目,其中有很多依赖项。我希望像嵌入资源一样,将所有引用的dll文件编译到.exe文件中。我尝试过ILMerge,但它无法处理.xaml资源。

所以我的问题是:有没有办法将一个具有多个依赖项的WPF项目合并为单个.exe文件?

0
0 Comments

将多个dll合并到一个单独的WPF应用程序exe文件中的原因是为了简化部署和分发过程,以及减少对外部依赖的需求。下面是解决这个问题的方法:

1. 在.csproj文件中添加以下代码:


  
    
      %(ReferenceCopyLocalPaths.DestinationSubDirectory)%(ReferenceCopyLocalPaths.Filename)%(ReferenceCopyLocalPaths.Extension)
    
  

2. 将Main Program.cs文件修改为以下内容:

[STAThreadAttribute]
public static void Main()
{
    AppDomain.CurrentDomain.AssemblyResolve += OnResolveAssembly;
    App.Main();
}

3. 添加OnResolveAssembly方法:

private static Assembly OnResolveAssembly(object sender, ResolveEventArgs args)
{
    Assembly executingAssembly = Assembly.GetExecutingAssembly();
    AssemblyName assemblyName = new AssemblyName(args.Name);
    var path = assemblyName.Name + ".dll";
    if (assemblyName.CultureInfo.Equals(CultureInfo.InvariantCulture) == false) path = String.Format(@"{0}\{1}", assemblyName.CultureInfo, path);
    using (Stream stream = executingAssembly.GetManifestResourceStream(path))
    {
        if (stream == null) return null;
        var assemblyRawBytes = new byte[stream.Length];
        stream.Read(assemblyRawBytes, 0, assemblyRawBytes.Length);
        return Assembly.Load(assemblyRawBytes);
    }
}

这是一个简洁的解决方案,不需要外部依赖。只需要按照以下三个步骤操作:

1. 编辑.csproj文件并粘贴提供的代码段

2. 创建一个.cs文件,粘贴提供的代码并自动解析缺失的程序集

3. 将启动对象更改为刚创建的文件

这个解决方案非常简洁,不需要外部依赖。唯一与其他人不同的是,我重写了App.OnStartup方法来挂钩AssemblyResolve,这样我就不需要一个新的启动对象。

在我的情况下,App.OnStartup()太晚注册OnAssemblyResolve,因为在调用OnStartup时,我的应用程序引用了一些额外的程序集。相反,我将OnAssemblyResolve注册放在了App()构造函数中,这样就解决了问题。

只是在这里我不知道如何将依赖项转换为EmbeddedResource。通过使用NuGet添加依赖项,我将它们一个个添加为链接到解决方案中的新文件夹中的文件,这样它们就会嵌入到输出可执行文件中。但是,它们仍然会被复制到输出文件夹中。我只是在部署过程中忽略它们。是否有更好的解决方案?

非常感谢!我必须稍作调整,但对于我的情况来说,这比获取或支付其他解决方案要好得多。

我已经使用了几年,但今天有四台计算机无法正常运行。有什么想法吗?

我无法使其工作。我正在尝试将Resources.fr文件与.exe文件一起包含。

0
0 Comments

问题的出现原因是希望将多个dll文件合并到一个单独的.exe文件中,以便简化应用程序的部署和分发,并提高应用程序的运行效率。然而,ILMerge等工具在合并WPF应用程序时存在一些限制和问题,无法完全满足需求。

解决方法是使用{smartassembly}或ILRepack等工具。{smartassembly}是一款商业工具,可以混淆或嵌入dll文件。ILRepack是一个开源替代品,支持大多数WPF情况下的合并操作。ILRepack相比ILMerge更加灵活易用,可以解决ILMerge无法解决的问题。

然而,ILRepack也存在一些限制,它无法让用户指定要合并的文件,而是限制在已检测到的文件范围内。这意味着一些资源dll文件(包含翻译字符串)仍然保持独立,导致最终生成的可执行文件仍然包含额外的dll文件。这与合并dll到一个可执行文件的初衷相悖。

合并dll文件到一个单独的.exe文件中的需求在WPF应用程序中存在一些挑战和限制。虽然可以使用{smartassembly}或ILRepack等工具来实现合并,但仍然无法完全满足最终的合并目标。

0
0 Comments

使用Costura.Fody-它作为Nuget Pkg提供,是将资源嵌入到程序集中的最佳和最简单的方法。

Install-Package Costura.Fody

将其添加到项目后,它将自动将所有添加的引用嵌入到主程序集中。

请注意,该包现在处于维护模式,开发人员建议使用替代方法。然而,根据我的经验,这个包仍然很好用。

0