[WPF/.NET] AssemblyInfo 用法文檔


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)整 AssemblyFileVersionAssemblyInformationalVersion

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

典型場景:

  1. 程序集拆分

    • 原來所有代碼都在一個 DLL
    • 后來拆成多個 DLL,按模塊管理
  2. 重構(gòu)遷移

    • 把某些類型遷移到新的類庫中
    • 但又希望舊代碼盡量不受影響
  3. 兼容老版本

    • 老項目仍引用舊程序集
    • 新版本通過類型轉(zhuǎn)發(fā)減少升級成本

3.3 你的示例說明

例如:

[assembly: TypeForwardedTo(typeof(CoreDevice.Device.Execute))]
[assembly: TypeForwardedTo(typeof(CoreDevice.Device.ModbusRTU))]
[assembly: TypeForwardedTo(typeof(CoreDevice.LibModbus.Modbus))]

說明這些類型:

  • Execute
  • ModbusRTU
  • Modbus

雖然從邏輯上仍屬于原有對外 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)品信息
  • InternalsVisibleTo
  • ComVisible
  • Guid
  • TypeForwardedTo

如果項目是 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,很多情況下仍然能工作。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容