Как создать новый com-объект с параметрами, используя powerhsell? - PullRequest
1 голос
/ 11 июля 2010

У меня есть COM-объект с несколькими конструкторами, я пытаюсь создать новый экземпляр и передаю параметры конструктору с помощью powershell 2.0, но получаю эту ошибку: набор параметров не может быть разрешен с использованием указанных именованных параметров.

Это код:

$paramsInfo = New-Object -ComObject 'MyObject.ObjectA' 
$comObj = New-Object -ComObject 'MyObject.ObjectB'  -ArgumentList  $paramsInfo

Этот код не работает !!!Любая помощь?

Ответы [ 2 ]

1 голос
/ 11 июля 2010

COM не имеет понятия конструктора. Он соответствует сверхчистому стилю программирования на основе интерфейса, реализация всегда скрыта, и вы всегда работаете только с интерфейсами. Интерфейсы очень легко сделать переносимыми между языковыми средами исполнения, реализация никогда не бывает. Многие языки, которые реализуют COM, не имеют понятия о конструкторе, это концепция ООП.

COM-объекты создаются с помощью API-функции CoCreateInstance (), стандартного фабричного метода для COM-объектов. Он не может передать какие-либо аргументы реальной фабрике классов, которые он может использовать для передачи аргументов в конструктор. Настоящая фабрика - реализация интерфейса IClassFactory в сверхчистом стиле.

Хотя многие языки поддерживают создание своих классов видимыми для COM-клиентов (например, атрибут .NET [ComVisible]), будет вызываться только их конструктор без параметров. Обязательно так.

Если вам нужен фабричный метод, который принимает аргументы, просто напишите свой собственный. Реализуйте свой собственный заводской интерфейс. Никаких ограничений на аргументы, которые вы можете передать его методу Create (), то, как вы передаете их конструктору, является невидимой деталью реализации:)

0 голосов
/ 11 июля 2010

Для COM-объекта попробуйте использовать хеш-таблицу -Property вместо -ArgumentList.

$comObj = new-object -com 'MyObject.ObjectB' -Property @{propToSet=$paramsInfo}

Ссылка: http://technet.microsoft.com/en-us/library/dd315334.aspx

...