【发布时间】:2013-05-06 23:43:29
【问题描述】:
我想从 PowerShell 枚举当前进程中的所有 AppDomain。该过程恰好是托管StudioShell 的Visual Studio。为此,我需要实例化 CorRuntimHost,它是 mscoree.tlb 的一部分,所以我可以适应 this C# code..
我试图获取 CorRunTimeHost 的正确名称并将其传递给 New-Object -COMObject "objectName"。根据this forum posting,我搜索了注册表,我认为正确的名称是CLRMetaData.CorRuntimeHost。然而,虽然New-Object -ComObject 'CLRMetaData.CorRuntimeHost' -Strict 确实返回了一个对象,但它只公开了 COM 对象的固有方法。
基于this stackoverflow question 我尝试了[Activator]::CreateInstance()。但是下面两条语句给我带来了和New-Object一样的问题,就是我不能调用ICorRuntimeHost::EnumDomains()方法。
$corRuntimeHost = [Activator]::CreateInstance([Type]::GetTypeFromProgID('CLRMetaData.CorRuntimeHost'));
$enumerator = $null;
$corRuntimeHost.EnumDomains([ref]$enumerator);
Method invocation failed because [System.__ComObject] doesn't contain a method named 'EnumDomains'.
At line:1 char:1
+ $corRuntimeHost.EnumDomains([ref]$enumerator)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : MethodNotFound
【问题讨论】:
-
您可以将 C# 代码直接嵌入到您的 powershell 脚本中,如第 4 步中所述:blogs.msdn.com/b/mattbie/archive/2010/02/23/…
-
-
您无法使用 LoadFromFile 加载 TLB,您必须将 C# 转换为“纯”C# 声明,而不是添加 .TLB 作为参考。
标签: powershell com clr appdomain