在 .net 项目的 AssemblyInfo 文件中,可以通过以下方式指定自定义程序集属性
[组装:组装元数据(“key1”,“value1”)]
我的问题是如何通过 powershell 从已编译的 .net 程序集中检索此值?我能够读取所有标准属性,如文件版本、公司名称等,但我很难获得这个自定义属性(key1)的值
在 .net 项目的 AssemblyInfo 文件中,可以通过以下方式指定自定义程序集属性
[组装:组装元数据(“key1”,“value1”)]
我的问题是如何通过 powershell 从已编译的 .net 程序集中检索此值?我能够读取所有标准属性,如文件版本、公司名称等,但我很难获得这个自定义属性(key1)的值
建立@Keith Hill -
$assembly = [Reflection.Assembly]::ReflectionOnlyLoadFrom("$pwd\ClassLibrary1.dll")
$metadata = @{}
[reflection.customattributedata]::GetCustomAttributes($assembly) | Where-Object {$_.AttributeType -like "System.Reflection.AssemblyMetadataAttribute"} | ForEach-Object { $metadata.Add($_.ConstructorArguments[0].Value, $_.ConstructorArguments[1].Value) }
获取转换为字典对象的 AssemblyMetadata。您可以使用以下方法获取值:
$metadata["key1"]
导致:
value1
尝试这样的事情:
32# (get-date).GetType().Assembly.GetCustomAttributes([Reflection.AssemblyCopyrightAttribute], $false)
Copyright TypeId
--------- ------
© Microsoft Corporation. All rights reserved. System.Reflection.AssemblyCopyrightAttribute
而不是get-date
使用您感兴趣的程序集中的实例。还替换您有兴趣检索的 Assembly*Attribute。
在 AssemblyMetadataAttribute 的特定情况下,它是 .NET 4.5 的新特性。PowerShell 仍在 .NET 4.0 上。因此,您必须使用仅反射上下文来获取此属性:
$assembly = [Reflection.Assembly]::ReflectionOnlyLoadFrom("$pwd\ClassLibrary1.dll")
[reflection.customattributedata]::GetCustomAttributes($assembly)
吐出:
AttributeType Constructor ConstructorArguments
------------- ----------- --------------------
System.Runtime.Versioning.... Void .ctor(System.String) {".NETFramework,Version=v4...
System.Reflection.Assembly... Void .ctor(System.String) {"ClassLibrary1"}
System.Reflection.Assembly... Void .ctor(System.String) {""}
System.Reflection.Assembly... Void .ctor(System.String) {""}
System.Reflection.Assembly... Void .ctor(System.String) {"CDL/TSO"}
System.Reflection.Assembly... Void .ctor(System.String) {"ClassLibrary1"}
System.Reflection.Assembly... Void .ctor(System.String) {"Copyright © CDL/TSO 2013"}
System.Reflection.Assembly... Void .ctor(System.String) {""}
System.Reflection.Assembly... Void .ctor(System.String, ... {"key1", "value1"}
System.Runtime.InteropServ... Void .ctor(Boolean) {(Boolean)False}
System.Runtime.InteropServ... Void .ctor(System.String) {"945f04e1-dae3-4de6-adf6-...
System.Reflection.Assembly... Void .ctor(System.String) {"1.0.0.0"}
System.Diagnostics.Debugga... Void .ctor(DebuggingModes) {(System.Diagnostics.Debug...
System.Runtime.CompilerSer... Void .ctor(Int32) {(Int32)8}
System.Runtime.CompilerSer... Void .ctor() {}
注意输出中的key1
ane value1
。