警告︰此程序集被標記爲“引用程序集”,這意味着它只包含元數據,沒有可執行代碼。 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章