2009-10-28 7 views
4

PowerShell로 포팅을 시도하는 C#에서 다음 코드를 사용합니다. 하지만 방법 포트이 캐스트 모른다 :PowerShell의 COM 인터페이스 래퍼?

((_ISkypeEvents_Event)skype).CallStatus += CallStatusHandler; 

을 그냥 입력하면 [Skype4COM.ISkypeEvents_Event] 내 PowerShell 콘솔에서 내가 얻을 :

유형 [Skype4COM.ISkypeEvents_Event를 찾을 수 없습니다 ] :이 유형을 포함하는 어셈블리가로드되었는지 확인하십시오.

$skype = New-Object -ComObject Skype4COM.Skype 

가 다음 줄을 작동하지 않습니다 :

$skypeevent = [Skype4COM._ISkypeEvents_Event]$skype 

내가 직접 메소드를 호출하려고하면

그러나, 나는 $ 스카 이프 객체의 멤버를 얻을 수 있습니다 다음과 같이 $ skype 객체에서 :

$skype.add_CallStatus({ write-host "yay" }) 

... it 예상대로) 나에게 그것을 알려줍니다 : [시스템 .__하여 ComObject #이 {b1878bfe-53d3-402e-8c86-190b19af70d5가}] 'add_CallStatus'라는 메서드가 포함되어 있지 않기 때문에

메소드 호출에 실패했습니다.

나는 COM 래퍼를 만들려고했지만, 그것은 여전히 ​​COM 인터페이스 유형을 얻기에 실패 ...

어떤 아이디어가? 큰 감사를 드린다!

답변

5

PowerShell 특수 사례 구성원을 호출자에게 노출시키기 위해 고유 한 후기 바인딩 "COM 어댑터"(및 Get-Member cmdlet)가있는 COM 개체입니다. 불행하게도이 문제는 연결된 type library을 찾을 수없는 경우가 종종 실패합니다. 인스턴스가 실제로 transparentproxy 유형을 통해 표면화 된 원격 COM 객체 일 때 일반적으로 발생합니다.

이 COM 적응의 또 다른 부작용은 이러한 종류의 캐스트를 사용하여 멤버에 액세스하는 것을 간접적으로 막을 수 있다는 것입니다. PowerShell은 일반적으로 모든 인터페이스의 구성원을 포함하는 interop 어셈블리 (동적으로 생성되거나 PIA) CoClass 클래스를 제공합니다. 사실, 인터페이스에 대한 이러한 제한은 COM 개체에만 국한되지 않습니다. PowerShell의 ".NET 어댑터"는 일반 .NET 인터페이스도 처리하지 않습니다. 솔직하게, 이것은 99 %의 경우 선호되는 행동입니다. PowerShell은 동적 언어이며 런타임에 항상 참 유형의 참조를 노출합니다. 인터페이스로 전송하려고 시도하면 무시됩니다.

이렇게하면 C#에서 명시 적으로 인터페이스를 구현할 때 더 많은 문제가 발생합니다. PowerShell에서 전혀 볼 수 없습니다! I did blog about a technique은 v2.0 모듈을 사용하여 명시 적 인터페이스 멤버를 프록시합니다. COM 인터페이스와 비교해 볼 수도 있지만 작동 여부는 확실하지 않습니다.

관련 문제