强迫症福利--收起.NET程序的dll来

作为上床后需要下床检查好几次门关了没有的资深强迫症患者,有一个及其搞我的问题,就是dll问题。

曾几何时,在没有nuget的年代,当有依赖项需要引用的时候,只能通过文件引用来管理引用问题,版本问题,更新问题层出不穷,很是难受。

后来出来nuget,喜大普奔,总算解决了引用的问题。开心之余,依然还有一个很膈应人的问题:生成文件夹满地的dll,找个exe眼睛很难受。

讲道理这个也不是什么大问题,但是就是心痒痒,就特别想把这些dll收到一个单独文件夹里面,外面就留exe和配置等文件。然后就找这个东西:PrettyBin。

PrettyBin

PrettyBin是一个开源的nuget包:https://github.com/slmjy/PrettyBin,使用它可以将.NET Framework程序引用的文件收到lib文件夹里面,使用起来也非常方便,老样子,直接nuget安装。

Install-Package PrettyBin

提示重新加载项目,点击确定,就完事了。
安装之前,输出是这样的:

安装之后,输出是这样的:

dll之类的文件都进lib文件夹了,感觉世界都干净了很多。

补充

  1. 细心的童鞋应该能够发现,我写的是.NET Framework的程序引用,.NET Core,.NET Standard呢?
    答案是:.NET Core啥的东西生成的就是dll,都一样就没必要了。

  2. 安装prettybin之后,再安装新的包会怎么样?受不受影响?
    依然有用,不受影响。

  3. 对于新的nuget管理形式PackageReference效果如何怎么样?
    这个有说法的,需要先了解这个包工作的原理。

原理解析

首先看看安装的时候,nuget包管理器弹出的提示:

正在执行脚本文件“ConsoleApp4\packages\PrettyBin.1.1.0\tools\init.ps1”
Init BinPrettify
正在执行脚本文件“ConsoleApp4\packages\PrettyBin.1.1.0\tools\install.ps1”
Install PrettifyBin; 
http://schemas.microsoft.com/developer/msbuild/2003
No Target AfterBuild Node. Creating
No ItemGroup whith MoveToLibFolder tag. Creating
No Move tag in AfterBuild Target. Creating
Edititing App.config
runtimeNode items
No probing Node. Creating
已将“PrettyBin 1.1.0”成功安装到 ConsoleApp4

可以看到,这里首先执行的是给项目文件添加``msbuild内容,增加了AfterBuild节点,MoveToLibFolder节点和Move`节点。

<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Target Name="AfterBuild">
<ItemGroup>
    <MoveToLibFolder Include="$(OutputPath)*.dll ; $(OutputPath)*.pdb ; $(OutputPath)*.xml" />
</ItemGroup>
<Move SourceFiles="@(MoveToLibFolder)" DestinationFolder="$(OutputPath)lib" OverwriteReadOnlyFiles="true" />
</Target>

msbuild可以设置生成后的操作,成功生成之后,将目录下面的dll文件,pdb文件和xml都转到了lib文件夹。
然后修改了app.config文件,在runtime底下增加了一个probing节点。

<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <probing privatePath="lib;libs" xmlns="" />
</assemblyBinding>
</runtime>

probing节点提供.NET程序集查找的选项,privatepath指定路径,详细资料可以查看MSDN:https://support.microsoft.com/en-us/help/837908/how-to-load-an-assembly-at-runtime-that-is-located-in-a-folder-that-is
补充资料:关于指定程序集位置

所以,prettybin是通过运行powershell脚本设置生成成功后转移文件,并将程序集查找路径调整为lib文件夹。

根据https://docs.microsoft.com/zh-cn/nuget/reference/migrate-packages-config-to-package-reference,PackageReference方式nuget是不支持install.ps1脚本的。所以并不能支持prettybin。

新建.NET Framework程序是默认是通过传统的package.config文件进行包管理的,新建.NET Core和.NET Standard都是默认使用PackageReference包管理。

结论

  1. 如果需要使用PrettyBin,那么直接默认配置.NET FRAMEWORK项目的nuget管理方式,完美支持。
  2. 如果需要升级新的包管理方式,可以在安装了PrettyBin之后升级项目,依然支持。
  3. 升级了PackageReference之后,安装PrettyBin无效。

P.S. 补充不使用prettybin,也不调用AFTERBUILD的一种实现:https://www.broculos.net/2014/03/visual-studio-build-dlls-to-separate.html#.WWiTjJFJLy8

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


fastjson2 是 fastjson 项目的重要升级,目标是为下一个十年提供一个高性能的 JSON 库,同一套 API 支持JSON/JSONB 两种协议,JSONPath 是一等公民,支持全量解析和部分解析,支持 Java 服务端、客户端Android、大数据场景。 fastjson 2 代码
博文目录文章目录问题描述解决方案问题描述阿里云ECS, 系统切换为 Aliyun Linux 2.1903 LTS 64位 后, SSH可以连接, SFTP无法连接, 端口 22 已添加到阿里云ECS网络安全组表现为 Xshell 可以连接, Xftp 使用 SFTP 协议无法连接, 一片空白, 很长时间也不报错提示, 鼠标挪动的时候显示为圆圈(等待响应)解决方案将 /etc/ssh/sshd_config 中的Subsystem sftp /usr/libexec/opens
博文目录文章目录创建项目创建代码仓库完成工程代码并提交推送到仓库application.propertiespom.xml创建构建计划设置流程配置阶段说明 测试阶段说明 部署定义远程服务器信息远程服务器鉴权创建 SSH 密钥录入凭据在 持续集成 的 构建脚本 中做 SSH 鉴权操作远程服务器设置触发规则设置变量与缓存CODING 持续集成 帮助文档当下 DevOps, CI/CD 等概念非常火, 我自己也想试试, 碰巧知道 CODING.NET 免费提供了这个能力, 所以来尝试一把, 好在最终有
下载CentOS官网CentOS下载CentOS-7-x86_64-DVD-2003.isoCentOS-7-x86_64-DVD-2003.iso安装
博文目录文章目录服务端客户端测试效果服务端配置到 nginx 反向代理FRP Releases使用frp进行内网穿透FRP 示例FRP 实例 通过自定义域名访问内网的 Web 服务FRP 参考 服务端配置FRP Linux Server ReleaseFRP Windows Client Release服务端在 linux 上执行 arch, 结果如果是 [X86_64] 即可选择 [linux amd64] 版本的 Release 包wget https://github.co
博文目录文章目录环境下载安装配置使用环境阿里云ECS(Aliyun Linux 2.1903 LTS 64位)下载https://www.oracle.com/java/technologies/oracle-java-archive-downloads.htmlJava SE 8 (8u202 and earlier) 可以用于商业Java SE 8 (8u211 and later) 不可以用于商业安装tar -zxvf jdk-8u202-linux-x64.tar.gz 得到
博文目录文章目录环境下载安装配置使用环境阿里云ECS(Aliyun Linux 2.1903 LTS 64位)下载https://maven.apache.org/download.cgi安装tar -zxvf apache-maven-3.6.3-bin.tar.gz 得到解压包配置在 /root/.bashrc 文件内添加如下内容export MAVEN_HOME=/mrathena/application/maven-3.6.3export PATH=$JAVA_HOME/
博文目录文章目录嵩山版(2020.08.03)阿里开发手册官网嵩山版(2020.08.03)手册的详细版叫做 码出高效
博文目录文章目录EncodingFontMavenGradleOtherPluginsEncodingsetting 搜索 encodFile | Settings | Editor | File Encodings, 3个 UTF-8File | Settings | Tools | SSH Terminal, 1个 UTF-8Fontsetting 搜索 fontFile | Settings | Editor | FontMavensetting 搜索 mavenFile |
博文目录文章目录环境下载安装配置使用参考环境阿里云ECS(Aliyun Linux 2.1903 LTS 64位)下载http://nginx.org/en/download.htmlhttp://nginx.org/download/nginx-1.18.0.tar.gz选择稳定版(Stable version)下载即可, 分 linux 和 windows 两种, linux 版下载的是源码, 需要自行编译安装tar -zxvf nginx-1.18.0.tar.gz 得到解压包
博文目录文章目录单密钥方式多密钥方式默认生成的 rsa密钥位置在 ~/.ssh, 如 C:Usersmrathena.ssh. 各代码托管平台是可以使用同一个SSH密钥的, 这样最方便, 但是为了更安全也可以配置在不同的平台使用不同的密钥单密钥方式cmd 执行命令 ssh-keygen -t rsa -b 4096 -C "generic", -t type rsa, -b 位数 4096位, 如果不用 -C 指定邮箱, 则会生成一个默认的注释, 该注释无关紧要, 不影响验证选项全部默认(
博文目录文章目录环境下载安装配置使用参考环境阿里云ECS(Aliyun Linux 2.1903 LTS 64位)下载https://github.com/git/git/releaseshttps://codeload.github.com/git/git/tar.gz/v2.28.0, 下载之后可以重命名为 git-2.28.0.tar.gz安装tar -zxvf apache-maven-3.6.3-bin.tar.gz 得到解压包make prefix=/mrathena/a
博文目录文章目录环境下载安装简单配置汉化皮肤JDKMaven简单使用环境阿里云ECS(Aliyun Linux 2.1903 LTS 64位)下载Jenkins 官网, 支持选择中文https://www.jenkins.io/选择 LTS 长期支持版的最新版下载, 这里是 2.235.3 LTS, Generic Java package (.war) 是 java war 包, 可以通过 java -jar jenkins.war 直接运行官网下载 wget http://mir
原因分析 是因为使用了pycharm的版本的问题。并不是flask框架本身的问题(不管你是如何设置的flask配置,通过加载config也好,还是通过run的时候传入形参也好,均不影响) 可以很明显的
背景 兜兜转转以为做测试不用接触这么多编程,结果不仅要接触 py,还要接触 java,还有 elixir,更有 Lua,啊 我绝望了 太久没玩 Java,连导入项目都不会了...特此记录一下侮辱性的时
1. 安装制作工具 mkisofs 2. Linux 操作系统镜像 iso 打包 3. 校验并写入 md5 值
最近在学习 MySQL 的 bin-log 时候考虑到数据备份的问题,突然想到如果能将数据通过 Linux 命令行方式备份到百度网盘,那是一件多么牛逼的事情。百度网盘有免费的 2TB 存储空间,而且有
作为一名开发者,熟悉使用 git 代码管理工具是一项必备的基本技能。git 相较 SVN 而言,其优点不言而喻。git 的功能非常强大,其包括的操作命令也非常的多,但是从实用性而言,很多命令可能我们一
kickstart 能实现 linux 系统的自动化安装,需要设置 ks.cfg 文件,而这个 ks.cfg 文件的生成最好使用 system-config-kickstart 工具生成,比较准确,也
介绍 GitBook是一个基于Node.js的命令行工具,可使用 Github/Git和Markdown来制作精美的电子书,GitBook 并非关 Git的教程。 导出格式有PDF、HTML等,需要添