GenerateResource 工作
在 .txt
與 .resx
(XML 型資源格式)檔案和 Common Language Runtime 二進位 .resources
檔案之間轉換,這些檔案可以內嵌在運行時間二進位可執行檔中,或編譯成附屬元件。 此工作通常用於將 .txt
或 .resx
檔案轉換成 .resources
檔案。
GenerateResource
工作的運作方式與 resgen.exe類似。
謹慎
.resx
檔案中的資源可以使用 BinaryFormatter
串行化,不安全。 將那些 .resx
檔案包含在您信任的建置程式中。
參數
下表描述 GenerateResource
工作的參數。
參數 | 描述 |
---|---|
AdditionalInputs |
選擇性 ITaskItem[] 參數。包含此工作所完成之相依性檢查的其他輸入。 例如,專案和目標檔案通常應該是輸入,因此,如果已更新,則會重新產生所有資源。 |
EnvironmentVariables |
選擇性 String[] 參數。指定應該傳遞至繁衍 resgen.exe的環境變數名稱/值組陣列,除了一般環境區塊之外,也可以選擇性地覆寫。 |
ExcludedInputPaths |
選擇性 ITaskItem[] 參數。指定項目陣列,指定在最新檢查期間會忽略追蹤輸入的路徑。 |
ExecuteAsTool |
選擇性 Boolean 參數。如果 true ,請從適當的目標架構執行 tlbimp.exe,並從程式外 aximp.exe,以產生必要的包裝函式元件。 這個參數允許多重目標 ResolveComReferences 。 |
FilesWritten |
選擇性 ITaskItem[] 輸出參數。包含寫入磁碟的所有檔案名稱,包括快取檔案,如果有的話。 此參數適用於 Clean 的實作。 |
MinimalRebuildFromTracking |
選擇性 Boolean 參數。取得或設定參數,指定是否將使用追蹤的累加建置。 如果 true ,則會開啟累加建置;否則,將會強制重建。 |
NeverLockTypeAssemblies |
選擇性 Boolean 參數。取得或設定 Boolean 值,指定只有在資源文件參考用戶元件時,才能建立新的 AppDomain 評估資源 ( .resx ) 檔案 (true) 或建立新的 AppDomain。 |
OutputResources |
選擇性 ITaskItem[] 輸出參數。指定產生的檔名,例如 .resources 檔案。 如果您未指定名稱,則會使用相符輸入檔的名稱,而所建立的 .resources 檔案會放在包含輸入檔的目錄中。 |
PublicClass |
選擇性 Boolean 參數。如果 true ,則會建立強型別資源類別做為公用類別。 |
References |
選擇性 String[] 參數。從 .resx 檔案載入型別的參考。
.resx 檔案數據元素可能有 .NET 類型。 讀取 .resx 檔案時,必須解析此類型。 一般而言,它會使用標準類型載入規則順利解決。 如果您在 References 中提供元件,則會優先使用。強型別資源不需要此參數。 |
SdkToolsPath |
選擇性 String 參數。指定 SDK 工具的路徑,例如 resgen.exe。 |
Sources |
必要 ITaskItem[] 參數。指定要轉換的專案。 傳遞至此參數的項目必須具有下列其中一個擴展名: - .txt :指定要轉換之文本檔的擴展名。 文字檔只能包含字串資源。- .resx :指定要轉換之 XML 型資源檔的擴展名。- .restext :指定與 .txt 相同的格式。 如果您想要清楚區分包含建置程式中其他來源檔案之資源的來源檔案,這個不同的擴充功能會很有用。- .resources :指定要轉換之資源檔的擴展名。 |
StateFile |
選擇性 ITaskItem 參數。 指定選擇性快取檔案的路徑,用來加速 .resx 輸入檔中連結的相依性檢查。 |
StronglyTypedClassName |
選擇性 String 參數。指定強型別資源類別的類別名稱。 如果未指定此參數,則會使用資源檔的基底名稱。 |
StronglyTypedFilename |
選擇性 ITaskItem 參數。 指定來源檔案的檔名。 如果未指定此參數,類別的名稱會當做基底檔名使用,擴展名取決於語言。 例如:MyClass.cs。 |
StronglyTypedLanguage |
選擇性 String 參數。指定產生強型別資源的類別來源時要使用的語言。 此參數必須完全符合 CodeDomProvider 所使用的其中一種語言。 例如: VB 或 C# 。藉由將值傳遞至此參數,您可以指示工作產生強型別的資源。 |
StronglyTypedManifestPrefix |
選擇性 String 參數。指定要在強型別資源的產生類別來源中使用的資源命名空間或指令清單前置詞。 |
StronglyTypedNamespace |
選擇性 String 參數。指定要用於強型別資源的產生類別來源的命名空間。 如果未指定此參數,任何強型別資源都位於全域命名空間中。 |
TLogReadFiles |
選擇性 ITaskItem[] 唯讀參數。取得表示讀取追蹤記錄的項目陣列。 |
TLogWriteFiles |
選擇性 ITaskItem[] 唯讀參數。取得表示寫入追蹤記錄的項目陣列。 |
ToolArchitecture |
選擇性 System.String 參數。 用來判斷 Tracker.exe 是否需要用來繁衍 ResGen.exe。 應該可剖析為 ExecutableType 列舉的成員。 如果 String.Empty ,請使用啟發學習法來判斷預設架構。 應該可剖析為 Microsoft.Build.Utilities.ExecutableType 列舉的成員。 |
TrackerFrameworkPath |
選擇性 String 參數。指定包含 FileTracker.dll之適當 .NET Framework 位置的路徑。 如果設定,則用戶會負責確保所傳遞之 FileTracker.dll 的位符合他們想要使用的 ResGen.exe 位。 如果未設定,工作會根據目前的 .NET Framework 版本來決定適當的位置。 |
TrackerLogDirectory |
選擇性 String 參數。指定將放置執行這項工作之追蹤記錄的中繼目錄。 |
TrackerSdkPath |
選擇性 String 參數。指定包含 Tracker.exe之適當 Windows SDK 位置的路徑。 如果設定,則用戶會負責確保所傳遞之 Tracker.exe 的位符合他們想要使用的 ResGen.exe 位。 如果未設定,工作會根據目前的 Windows SDK 決定適當的位置。 |
TrackFileAccess |
選擇性 Boolean 參數。 如果為 true,則會使用輸入檔的目錄來解析相對檔案路徑。 |
UsePreserializedResources |
選擇性 Boolean 參數。如果 true ,則指定使用 PreserializedResourceWriter 串行化非字串資源,而不是 ResourceWriter,而 .NET Core 或 .NET 5 或更新版本不支援。 |
UseSourcePath |
選擇性 Boolean 參數。如果 true ,則指定輸入檔的目錄用於解析相對檔案路徑。 |
言論
由於 .resx
檔案可能包含其他資源文件的連結,因此無法只比較 .resx
和 .resources
檔案時間戳,以查看輸出是否為最新狀態。 相反地,GenerateResource
工作會遵循 .resx
檔案中的連結,並檢查鏈接檔案的時間戳。 這表示您通常不應該在包含 GenerateResource
工作的目標上使用 Inputs
和 Outputs
屬性,因為這可能會導致它實際執行時略過。
除了上述參數之外,此工作也會從 TaskExtension 類別繼承參數,而該類別本身會繼承自 Task 類別。 如需這些其他參數及其描述的清單,請參閱 TaskExtension 基類。
使用 MSBuild 4.0 以 .NET 3.5 專案為目標時,組建可能會在 x86 資源上失敗。 若要解決此問題,您可以將目標建置為 AnyCPU 元件。
參數 UsePreserializedResources
從一般 .NET 建置程式中的 屬性 $(GenerateResourceUsePreserializedResources)
取得其值。 此屬性預設會在使用 .NET 5 或更新版本的 .NET Core 項目中設定為 true
。 您可以將 $(GenerateResourceUsePreserializedResources)
設定為 true
,讓 .NET SDK 建置以使用非字串資源之 .NET Framework 4.6.1 或更新版本為目標的專案。 元件 System.Resources.Extensions
必須在運行時間提供。 它適用於 .NET Core 3.0 和更新版本和 .NET 5 和更新版本,而且可透過 PackageReference 在 .NET Framework 4.6.1 或更新版本中使用。
例
下列範例會使用 GenerateResource
工作,從 Resx
專案集合指定的檔案產生 .resources
檔案。
<GenerateResource
Sources="@(Resx)"
OutputResources="@(Resx->'$(IntermediateOutputPath)%(Identity).resources')">
<Output
TaskParameter="OutputResources"
ItemName="Resources"/>
</GenerateResource>
GenerateResource
工作會使用 <EmbeddedResource>
專案的 <LogicalName>
元數據來命名內嵌在元件中的資源。
假設元件名為 myAssembly,下列程式代碼會產生名為 someQualifier.someResource.resources
的內嵌資源:
<ItemGroup>
<EmbeddedResource Include="myResource.resx">
<LogicalName>someQualifier.someResource.resources</LogicalName>
<WithCulture>false</WithCulture>
</EmbeddedResource>
</ItemGroup>
如果沒有 <LogicalName>
元資料,資源會命名為 myAssembly.myResource.resources
。 此範例僅適用於 Visual Basic 和 Visual C# 建置程式。