У меня есть элемент управления ActiveX SetACL.ocx. Он зарегистрирован в моей системе, и я могу использовать его из C # (Visual Studio 2010) без проблем. В обозревателе объектов Visual Studio отображаются все методы.
Однако в PowerShell около трети методов не отображаются. Если я пытаюсь вызвать один из отсутствующих методов, я получаю MethodNotFound:
PS C:\> $setacl = New-Object -ComObject setacl.setaclctrl.1
PS C:\> $setacl | Get-Member
TypeName: System.__ComObject#{85869435-0ee3-440b-bf69-6c52c6638073}
Name MemberType Definition
---- ---------- ----------
AddACE Method int AddACE (string, bool, string, int, bool, int, int)
AddDomain Method int AddDomain (string, string, int, bool, bool)
AddTrustee Method int AddTrustee (string, string, bool, bool, int, bool, bool)
GetLastAPIError Method int GetLastAPIError ()
GetLastAPIErrorMessage Method string ()
GetLastListOutput Method string GetLastListOutput ()
GetResourceString Method string GetResourceString (int)
Reset Method void Reset ()
Run Method int Run ()
SetAction Method int SetAction (int)
SetListOptions Method int SetListOptions (int, int, bool, int)
SetLogFile Method int SetLogFile (string)
SetOwner Method int SetOwner (string, bool)
SetPrimaryGroup Method int SetPrimaryGroup (string, bool)
PS C:\> $setacl.SetObject("test", 1)
Method invocation failed because [System.__ComObject#{85869435-0ee3-440b-bf69-6c52c6638073}] doesn't contain a method named 'SetObject'.
At line:1 char:18
+ $setacl.SetObject <<<< ("test", 1)
+ CategoryInfo : InvalidOperation: (SetObject:String) [], RuntimeException
+ FullyQualifiedErrorId : MethodNotFound
Есть ли какие-либо подсказки относительно того, почему PowerShell отображает не все доступные методы, а браузер объектов Visual Studio?
Я пробовал 32- и 64-разрядные версии PowerShell.
Обновление 1:
Вот подпись одного из отсутствующих методов из файла ODL (да, у меня есть полный исходный код OCX, я его автор):
[id(2), helpstring ("Set the object on which all actions are to be performed")]
LONG SetObject(BSTR sObjectPath, LONG nObjectType);
Обновление 2:
Вот исходный код OCX , доступный для просмотра в sourceforge.
Обновление 3:
OCX можно загрузить из sourceforge . Он включен в файл SetACL 2.2.0.zip.
Обновление 4 - возможное решение:
Смена методов с DISPID 1-7 на более высокие DISPIDS и введение 7 новых фиктивных методов с DISPIDS 1-7, кажется, делают свое дело. Теперь все появляется в PoSh - кроме фиктивных методов.
У кого-нибудь есть объяснение этому?