System.Type.GetCustomAttributes для сборки, загруженной из общей сетевой папки, не отображает все атрибуты

У меня есть управляемый dll - repro.dll, который содержит класс TestModuleCommand, украшенный 2 атрибутами: System.ObsoleteAttribute и System.Management.Automation.CmdletAttribute (происходит из System.Management.Automation.dll, которая находится в GAC в Windows 7)

        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 (если он загружен из сетевого расположения) не может полностью увидеть S.M.A.dll. Я думаю, что CAS позволяет мне объявить в System.Management.Automation, что CmdletAttribute безопасен, но я не смог выяснить, как написать это объявление. Где я могу прочитать больше, чтобы полностью понять, что происходит? Любые слова мудрости приветствуются.

Спасибо,

Лукаш

PS. Ниже приведен пример, который каждый может попробовать по приглашению powershell.exe (в Windows 7 - командлет Add-Type впервые введен в 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

Ответы на вопрос(1)

Ваш ответ на вопрос