.net 如何使用PowerShell获取自定义程序集属性

.net 如何使用PowerShell获取自定义程序集属性,.net,powershell,assemblies,.net,Powershell,Assemblies,在.net项目的AssemblyInfo文件中,可以通过 [汇编:AssemblyMetadata(“key1”、“value1”)] 我的问题是如何通过powershell从编译的.net程序集中检索此值?我能够读取所有标准属性,如fileversion、companyname等。但我很难获取此自定义属性(key1)的值。请尝试以下方法: 32# (get-date).GetType().Assembly.GetCustomAttributes([Reflection.AssemblyCopy

在.net项目的AssemblyInfo文件中,可以通过

[汇编:AssemblyMetadata(“key1”、“value1”)]


我的问题是如何通过powershell从编译的.net程序集中检索此值?我能够读取所有标准属性,如fileversion、companyname等。但我很难获取此自定义属性(key1)的值。

请尝试以下方法:

32# (get-date).GetType().Assembly.GetCustomAttributes([Reflection.AssemblyCopyrightAttribute], $false)

Copyright                                                   TypeId
---------                                                   ------
© Microsoft Corporation.  All rights reserved.              System.Reflection.AssemblyCopyrightAttribute
使用感兴趣的程序集中的实例,而不是
get date
。还替换您感兴趣检索的Assembly*属性

在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

Building off@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

谢谢,但我已经试过很多了,已经是肉汤了。一个可以工作的代码段怎么样?
使用“1”参数调用“GetCustomAttributes”异常:无法解析对程序集“WebActivateX,版本=2.0.0.0,区域性=中性,PublicKeyToken=7b26dc2a43f6a0d4”的依赖关系,因为它尚未预加载。使用ReflectionOnly API时,必须通过ReflectionOnlyAssemblyResolve事件预加载或按需加载依赖程序集。“
看起来此方法不允许具有依赖项的程序集。这太棒了!我失败了。
使用“1”参数调用“GetCustomAttributes”时出现异常:”无法解析对程序集“WebActivateX,版本=2.0.0.0,区域性=中性,PublicKeyToken=7b26dc2a43f6a0d4”的依赖关系,因为它尚未预加载。使用ReflectionOnly API时,必须通过ReflectionOnlyAssemblyResolve事件预加载或按需加载依赖程序集。“
此方法似乎不允许具有依赖项的程序集。