美文网首页.NET
.net framework wpf 打包生成单个exe文件

.net framework wpf 打包生成单个exe文件

作者: 夜里的向日葵 | 来源:发表于2020-04-25 10:02 被阅读0次

    如果直接编译wpf程序,会在bin/Release生成此程序的exe文件以及引用的一些dll文件,如下图

    img

    要想执行此exe程序,那么必须将引用的dll放到同一目录,一旦引用的程序集多起来了就比较麻烦了,程序发给别人可能需要压缩成zip

    本文的目的是将此程序打包成单个exe文件,思路很简单,将引用的dll文件嵌入到exe中即可.

    将dll程序集嵌入到exe文件

    1.在项目csproj文件添加以下内容

        <Target Name="AfterResolveReferences">
            <ItemGroup>
                <EmbeddedResource Include="@(ReferenceCopyLocalPaths)" Condition="'%(ReferenceCopyLocalPaths.Extension)' == '.dll'">
                    <LogicalName>%(ReferenceCopyLocalPaths.DestinationSubDirectory)%(ReferenceCopyLocalPaths.Filename)%(ReferenceCopyLocalPaths.Extension)</LogicalName>
                </EmbeddedResource>
            </ItemGroup>
        </Target>
    

    2.App类添加以下代码

    static App() {
        var assembly = typeof(App).Assembly;
        AppDomain.CurrentDomain.AssemblyResolve += OnResolveAssembly;
    }
    
    private static Assembly OnResolveAssembly(object sender, ResolveEventArgs args) {
        var executingAssembly = Assembly.GetExecutingAssembly();
        var assemblyName = new AssemblyName(args.Name);
    
        var path = assemblyName.Name + ".dll";
        if (assemblyName.CultureInfo.Equals(CultureInfo.InvariantCulture) == false)
            path = $@"{assemblyName.CultureInfo}\{path}";
        using var 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);
    }
    

    完成! 接下来我们编译项目,打开bin/Release目录


    image.png

    可以发现HelloWorld.exe体积变大了,因为dll文件已经嵌入到里面了, 这里我们只把exe复制出来, 是可以单独运行的. 到这里我们的目的就已经达到了. 但我们的bin/Release目录现在除了exe文件,其他文件是没有用处的, 通过下面的步骤我们可以去除其他的dll文件

    删除exe以外的文件

    在项目的csproj添加以下内容

       <Target Name="DeleteOtherFile" AfterTargets="AfterBuild">
            <ItemGroup>
                <OtherFiles Include="$(OutputPath)\*" Exclude="$(OutputPath)\$(AssemblyName).exe" />
            </ItemGroup>
            <Delete Files="@(OtherFiles)" />
        </Target>
    

    接着再次编译项目, 打开bin/Release目录

    image.png

    可以看到里面就剩这么单个文件了,大功告成~

    相关文章

      网友评论

        本文标题:.net framework wpf 打包生成单个exe文件

        本文链接:https://www.haomeiwen.com/subject/hvshwhtx.html