警告︰此程序集被标记为“引用程序集”,这意味着它只包含元数据,没有可执行代码。 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;NET6</TargetFrameworks>
<ProduceOnlyReferenceAssembly>true</ProduceOnlyReferenceAssembly>
</PropertyGroup>
</Project>

 


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

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

msbuild /p:ProduceOnlyReferenceAssembly=true
此时构建出来的 dll 就是只读程序集,里面不包含具体的实现

此构建方法适合在库里面进行,如果是在一个大的应用项目里面构建,如果发现构建不通过,就需要你了解很多构建相关的知识才能解决哈
————————————————
版权声明:本文为CSDN博主「lindexi_gd」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lindexi_gd/article/details/118608802

posted @ 2022-09-22 11:05  X-Cracker  阅读(188)  评论(0编辑  收藏  举报