我有一个托管 dll - repro.dll,其中包含装饰有 2 个属性的类 TestModuleCommand:System.ObsoleteAttribute 和 System.Management.Automation.CmdletAttribute(来自 Windows 7 中 GAC 中的 System.Management.Automation.dll)
namespace Test {
[System.Obsolete]
[System.Management.Automation.Cmdlet("Test", "Module")]
public class TestModuleCommand : System.Management.Automation.PSCmdlet {
protected override void ProcessRecord() {
this.WriteObject("In test-module");
}
}
}
如果将 repro.dll 放在本地目录中,我可以看到从 System.Type.GetCustomAttributes(false) 返回的两个属性。如果将 repro.dll 放在网络路径中,那么我只能看到一个属性(尽管我仍然可以通过 System.Reflection.CustomAttributeData.GetCustomAttributes(MemberInfo) 看到这两个属性)。这是不希望的——我想查看这两个属性(我知道实例化 CmdletAttribute 不会产生安全影响)。
根据我在网上找到的内容,我隐约知道 repro.dll(如果从网络位置加载)无法完全看到 SMAdll。我认为 CAS 允许我在 System.Management.Automation 中声明 CmdletAttribute 是安全的,但我无法弄清楚如何编写该声明。我在哪里可以阅读更多内容以完全了解正在发生的事情?欢迎任何智慧之言。
谢谢,
卢卡斯
PS。以下是任何人都可以在 powershell.exe 提示符下尝试的重现(在 Windows 7 中 - Add-Type cmdlet 在 PowerShell v2 中是新的):
PS C:\> Add-Type -TypeDefinition @"
>> namespace Test {
>> [System.Obsolete]
>> [System.Management.Automation.Cmdlet("Test", "Module")]
>> public class TestModuleCommand : System.Management.Automation.PSCmdlet {
>> protected override void ProcessRecord() {
>> this.WriteObject("In test-module");
>> }
>> }
>> }
>> "@ -OutputAssembly \\axp-test\scratch\lukasza\repro.dll -OutputType Library
>>
PS C:\> # local copy would work...
PS C:\> # Copy \\axp-test\scratch\lukasza\repro.dll ~\repro.dll
PS C:\>
PS C:\> $a = [System.Reflection.Assembly]::LoadFrom("\\axp-test\scratch\lukasza\repro.dll")
PS C:\> $t = $a.GetType("Test.TestModuleCommand")
PS C:\> $t.GetCustomAttributes($false) # only 1 attribute is visible here
Message IsError TypeId
------- ------- ------
False System.ObsoleteAttribute
PS C:\>
PS C:\> [System.Reflection.CustomAttributeData]::GetCustomAttributes($t) # but I can see both attributes here
Constructor ConstructorArguments NamedArguments
----------- -------------------- --------------
Void .ctor(System.String, System.Str... {"Test", "Module"} {}
Void .ctor() {} {}
PS C:\>
PS C:\> $a.Evidence
SecurityZone
------------
Intranet