AssemblyInfo 用法文檔
下面這篇可以直接當(dāng)作說明文檔使用。
AssemblyInfo 使用說明文檔
1. AssemblyInfo 簡介
AssemblyInfo 是 .NET 項目中用于聲明程序集級元數(shù)據(jù)的配置文件,常見文件名為:
AssemblyInfo.cs
它的作用是描述程序集本身的信息,而不是某個類或方法的信息。
常見用途包括:
- 定義程序集名稱相關(guān)信息
- 設(shè)置版本號
- 聲明 COM 可見性
- 設(shè)置 GUID
- 聲明友元程序集
- 進(jìn)行類型轉(zhuǎn)發(fā)
在傳統(tǒng) .NET Framework 項目中,AssemblyInfo.cs 常放在 Properties 目錄下。
在較新的 SDK 風(fēng)格項目中,很多程序集屬性也可以在 .csproj 中直接配置,部分內(nèi)容會自動生成。
2. 常見的 AssemblyInfo 配置項
2.1 基本信息
using System.Reflection;
[assembly: AssemblyTitle("CoreDevice")]
[assembly: AssemblyDescription("設(shè)備通信組件")]
[assembly: AssemblyCompany("XXX Company")]
[assembly: AssemblyProduct("CoreDevice Suite")]
[assembly: AssemblyCopyright("Copyright ? XXX")]
作用:
-
AssemblyTitle:程序集標(biāo)題 -
AssemblyDescription:程序集說明 -
AssemblyCompany:公司名稱 -
AssemblyProduct:產(chǎn)品名稱
2.2 版本信息
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
區(qū)別:
-
AssemblyVersion:程序集版本,影響程序集綁定 -
AssemblyFileVersion:文件版本,主要給 Windows 文件屬性顯示 -
AssemblyInformationalVersion:產(chǎn)品展示版本,可帶說明文字
說明:
- 如果隨意修改
AssemblyVersion,可能影響舊項目引用 - 一般發(fā)布時更常調(diào)整
AssemblyFileVersion和AssemblyInformationalVersion
2.3 COM 可見性
using System.Runtime.InteropServices;
[assembly: ComVisible(false)]
[assembly: Guid("12345678-abcd-1234-abcd-1234567890ab")]
作用:
-
ComVisible(false):默認(rèn)不對 COM 暴露類型 -
Guid:如果程序集需要 COM 互操作,會用到 GUID
2.4 友元程序集
using System.Runtime.CompilerServices;
[assembly: InternalsVisibleTo("CoreDevice.Tests")]
作用:
- 讓指定程序集訪問當(dāng)前程序集中的
internal成員 - 常用于單元測試項目訪問內(nèi)部實(shí)現(xiàn)
3. TypeForwardedTo 的作用
3.1 基本概念
TypeForwardedTo 用來聲明:
當(dāng)前程序集不再直接定義某個類型,而是把這個類型轉(zhuǎn)發(fā)到其他程序集。
示例:
using System.Runtime.CompilerServices;
[assembly: TypeForwardedTo(typeof(CoreDevice.Device.ModbusRTU))]
這表示:
-
ModbusRTU這個類型的實(shí)際定義不在當(dāng)前程序集 - 運(yùn)行時會去真正包含該類型的程序集里查找
3.2 為什么要使用 TypeForwardedTo
典型場景:
-
程序集拆分
- 原來所有代碼都在一個 DLL
- 后來拆成多個 DLL,按模塊管理
-
重構(gòu)遷移
- 把某些類型遷移到新的類庫中
- 但又希望舊代碼盡量不受影響
-
兼容老版本
- 老項目仍引用舊程序集
- 新版本通過類型轉(zhuǎn)發(fā)減少升級成本
3.3 你的示例說明
例如:
[assembly: TypeForwardedTo(typeof(CoreDevice.Device.Execute))]
[assembly: TypeForwardedTo(typeof(CoreDevice.Device.ModbusRTU))]
[assembly: TypeForwardedTo(typeof(CoreDevice.LibModbus.Modbus))]
說明這些類型:
ExecuteModbusRTUModbus
雖然從邏輯上仍屬于原有對外 API 的一部分,
但它們的實(shí)際代碼實(shí)現(xiàn)已經(jīng)放到了其他程序集。
這通常用于:
- 保持舊接口兼容
- 支持模塊化拆分
- 降低老項目遷移成本
4. TypeForwardedTo 使用示例
4.1 原始情況
原來所有類型都在 OldLibrary.dll 中:
namespace Demo
{
public class DeviceHelper
{
}
}
4.2 重構(gòu)后
把 DeviceHelper 挪到 NewLibrary.dll 中實(shí)現(xiàn)。
此時為了兼容舊引用,可以在原程序集里增加:
using System.Runtime.CompilerServices;
[assembly: TypeForwardedTo(typeof(Demo.DeviceHelper))]
這樣:
- 老項目引用
OldLibrary.dll - 實(shí)際類型定義在
NewLibrary.dll - CLR 通過轉(zhuǎn)發(fā)找到真正實(shí)現(xiàn)
5. 使用 TypeForwardedTo 的注意事項
5.1 必須保證目標(biāo)程序集可用
如果只寫了轉(zhuǎn)發(fā),但運(yùn)行時找不到真正實(shí)現(xiàn)該類型的 DLL,就會報錯。
5.2 類型不能在兩個地方重復(fù)定義
同一個完整類型不能既在當(dāng)前程序集定義,又被轉(zhuǎn)發(fā),否則會沖突。
5.3 更適合“遷移兼容”,不適合濫用
TypeForwardedTo 主要用于:
- 程序集拆分
- 歷史兼容
不建議把它當(dāng)作日常開發(fā)中的普通組織方式。
5.4 命名空間不變更時更容易兼容
如果遷移時連命名空間、程序集結(jié)構(gòu)都大改,兼容成本會更高。
6. 現(xiàn)代 .NET 項目中的變化
在 .NET Core / .NET 5+ / SDK 風(fēng)格項目中:
- 很多程序集屬性可直接寫在
.csproj -
AssemblyInfo.cs不一定手工維護(hù) - 但像
TypeForwardedTo、InternalsVisibleTo這類特性,仍然常常手工寫在.cs文件中
例如 .csproj 中可寫:
<PropertyGroup>
<AssemblyTitle>CoreDevice</AssemblyTitle>
<Version>1.0.0</Version>
<Company>XXX Company</Company>
</PropertyGroup>
7. 適合在項目中保留的 AssemblyInfo 內(nèi)容
一般建議保留這些內(nèi)容:
- 版本信息
- 產(chǎn)品信息
InternalsVisibleToComVisibleGuidTypeForwardedTo
如果項目是 SDK 風(fēng)格并且自動生成程序集信息,則應(yīng)避免和自動生成項重復(fù),防止編譯報重復(fù)特性錯誤。
8. 總結(jié)
AssemblyInfo 的本質(zhì)是:
定義程序集級別的元數(shù)據(jù)和行為。
而你這段 CoreDevice 代碼中的 TypeForwardedTo,本質(zhì)是:
為了程序集拆分或重構(gòu)后仍兼容舊代碼,把類型訪問轉(zhuǎn)發(fā)到新的實(shí)現(xiàn)程序集。
它的核心價值在于:
- 保持兼容
- 降低升級成本
- 支持模塊化拆分
你這段 AssemblyInfo 里的內(nèi)容,核心作用是:
把類型從舊程序集“轉(zhuǎn)發(fā)”到新程序集。
也就是說,外部項目原來可能引用的是某個舊 DLL,但這些類型實(shí)際上已經(jīng)被挪到了別的 DLL 里。通過 TypeForwardedTo,CLR 運(yùn)行時會知道:
- 這個類型雖然名字還屬于原來的程序集對外契約
- 但真正實(shí)現(xiàn)已經(jīng)在另一個程序集里
- 這樣可以盡量不改調(diào)用方代碼,保持兼容
你貼的這些代碼例如:
[assembly: TypeForwardedTo(typeof(CoreDevice.Device.Execute))]
[assembly: TypeForwardedTo(typeof(CoreDevice.Device.ModbusRTU))]
[assembly: TypeForwardedTo(typeof(CoreDevice.LibModbus.Modbus))]
表示這些類型已經(jīng)不在當(dāng)前程序集里直接實(shí)現(xiàn),而是被“轉(zhuǎn)發(fā)”到實(shí)際定義它們的程序集。
一、這些內(nèi)容具體是干嗎用的
1. AssemblyInfo 是什么
AssemblyInfo.cs 通常用來放程序集級別的元數(shù)據(jù),例如:
- 程序集標(biāo)題
- 版本號
- 公司信息
- COM 可見性
- GUID
- 類型轉(zhuǎn)發(fā)信息
以前傳統(tǒng) .NET Framework 項目里,這些內(nèi)容很多都寫在 Properties/AssemblyInfo.cs 中。
2. TypeForwardedTo 是什么
TypeForwardedTo 是程序集級別特性,作用是:
- 告訴運(yùn)行時:某個類型已經(jīng)移動到別的程序集
- 保持舊版本 API 的兼容性
- 減少因?yàn)椴鸱?DLL、重構(gòu)命名空間/程序集導(dǎo)致的引用崩潰
3. 你的場景里意味著什么
你這個 CoreDevice 的寫法,大概率說明項目做過這類調(diào)整:
- 以前某些類型在
CoreDevice主程序集里 - 后來把實(shí)現(xiàn)拆到了
CoreDevice.Device、CoreDevice.LibModbus等模塊 - 為了不讓老項目全部改引用,就在原程序集里加
TypeForwardedTo
這樣老代碼如果還寫:
using CoreDevice.Device;
或者還引用老 DLL,很多情況下仍然能工作。