msbuild 使用 ProduceOnlyReferenceAssembly 创建作为引用的仅公开成员程序集

Posted lindexi_gd

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了msbuild 使用 ProduceOnlyReferenceAssembly 创建作为引用的仅公开成员程序集相关的知识,希望对你有一定的参考价值。

本文告诉大家如何使用 msbuild 的 ProduceOnlyReferenceAssembly 功能,将某个程序集里面仅导出其中的公开成员定义,而不包含具体的实现的方法

有一些 NuGet 包在发布的时候,为了做一些有趣的业务,期望只是包含程序集的公开成员定义,如公开的方法和公开的属性和枚举等,但是不要包含具体的实现逻辑代码。这样的业务会用在为了减少 NuGet 包的体积,如为了制作插件使用的 NuGet 包。或者说在特定平台上不知道如何实现,只是为了辅助构建通过而已,如我在 Unity 3D 上提供的一些库,表示我不知道如何实现,我只是为了让构建能通过而已

使用 ProduceOnlyReferenceAssembly 可以让输出的程序集 dll 或 exe 里面只是包含了公开的成员的定义,但不包含具体的实现代码。这样的程序集是仅仅作为被引用的程序集使用的,不能被实际调用

下面来告诉大家如何构建这样的程序集,构建有两个方法,第一个是放在 csproj 项目文件里面。如在项目文件里面添加如下代码

<ProduceOnlyReferenceAssembly>true</ProduceOnlyReferenceAssembly>

添加之后的 csproj 文件代码大概如下

<?xml version="1.0" encoding="utf-8"?>
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFrameworks>net45;net46;netstandard2.0;netcoreapp3.1</TargetFrameworks>
    <ProduceOnlyReferenceAssembly>true</ProduceOnlyReferenceAssembly>
  </PropertyGroup>
</Project>

此时执行和之前一样的构建代码,如 msbuild 命令,在构建完成之后输出的 dll 可以看到比之前的小很多。通过 dnspy 等工具,可以看到这个 Dll 里面的所有类的方法都没有具体的实现

但是在很多应用上,更改 csproj 加上以上代码不现实。咱可以通过在构建的时候,修改构建命令来打出仅作为引用的程序集,如执行以下代码

msbuild /p:ProduceOnlyReferenceAssembly=true

此时构建出来的 dll 就是只读程序集,里面不包含具体的实现

此构建方法适合在库里面进行,如果是在一个大的应用项目里面构建,如果发现构建不通过,就需要你了解很多构建相关的知识才能解决哈

更多请看 C# Compiler Options - code generation options

官方文档是 Reference assemblies

更多关于 Roslyn 请看 手把手教你写 Roslyn 修改编译

我搭建了自己的博客 https://blog.lindexi.com/ 欢迎大家访问,里面有很多新的博客。只有在我看到博客写成熟之后才会放在csdn或博客园,但是一旦发布了就不再更新

如果在博客看到有任何不懂的,欢迎交流,我搭建了 dotnet 职业技术学院 欢迎大家加入

如有不方便在博客评论的问题,可以加我 QQ 2844808902 交流

知识共享许可协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系

以上是关于msbuild 使用 ProduceOnlyReferenceAssembly 创建作为引用的仅公开成员程序集的主要内容,如果未能解决你的问题,请参考以下文章

Docs-VisualStudio-MSBuild-MSBuild参考:常用的 MSBuild 项目属性

Docs-VisualStudio-MSBuild-MSBuild参考:MSBuild 命令行参考

我可以查看使用 MSBuild 实际执行的构建命令吗?

如何找出Visual Studio发送给MSBuild的命令?

使用 MsBuild 发布数据库项目

使用 CruiseControl.NET 和 MSBuild 发布网站