我有一个用C#编写的cmdlet,可以使用Microsoft.CSharp.CSharpCodeProvider成功地在内存中编译cmdlet(即,使用编译器选项.GenerateInMemory = $ true)。编译后,我可以访问已编译的cmdlet对象,例如[Namespace.InvokeApartmentCommand],因此该对象在某种程度上已加载到内存中。
这是问题所在:我希望能够从我现有的PowerShell会话中调用cmdlet(即,我用来编译C#的那个)。我不想将任何已编译的代码写入磁盘,而是在内存中工作。有可能吗?
我尝试了以下操作:
$foo = [Namespace.InvokeApartmentCommand]::New()
$foo.Apartment = [Threading.ApartmentState]::MTA # Specifics here do not matter, I would like this to work for any arbitrary cmdlet
$foo.Expression = {[Threading.Thread]::CurrentThread.GetApartmentState()}
$foo.Invoke()
不幸的是,当我运行.Invoke()时,出现以下错误:
An error occurred while enumerating through a collection: Cmdlets derived from PSCmdlet cannot be invoked directly. .
At line:1 char:1
+ $foo.Invoke()
+ ~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (System.Manageme...t+<Invoke>d__40:<Invoke>d__40) [], RuntimeException
+ FullyQualifiedErrorId : BadEnumeration
我该如何解决?