.Net程序集在PowerShell 2运行空间

时间:2016-05-06 04:14:07

标签: c# .net powershell

我正在通过RunspacePipeline从c#运行powershell脚本。

我需要支持Powershell 2

我的脚本使用[System.Net.WebRequest]

在本机上的PS CLI中,[System.Net.WebRequest]正常工作。

但是,从c#运行脚本会导致

Unable to find type [System.Net.WebRequest]: make sure that the assembly containing this type is loaded.

我尝试使用Add-Type加载System.Net并确认已加载[appdomain]::CurrentDomain.GetAssemblies()

但错误仍然存​​在

如果计算机有PS 3.0,则没有问题

修改:完整相关代码

InitialSessionState initial = InitialSessionState.CreateDefault();
runspace = RunspaceFactory.CreateRunspace(initial);
runspace.ApartmentState = System.Threading.ApartmentState.STA;
runspace.Open();
using (Pipeline pipeline = runspace.CreatePipeline()) {
  pipeline.Commands.AddScript(scriptText);
  <invoke, read output etc>
}

1 个答案:

答案 0 :(得分:1)

我创建了一个测试应用,发现这不是问题。

问题只发生在我的主应用程序中。

在缩小差异几个小时后,我发现我可以通过加载和使用我的共享模块在我的测试应用中重新创建问题。

我将其缩小为共享DLL模块中的共享GetMyVersion例程。

Assembly assembly = Assembly.GetExecutingAssembly();
return FileVersionInfo.GetVersionInfo(assembly.Location);

解决方案是在exe中尽早执行此代码。我能够在应用程序的其余部分中保留共享DLL例程的常规用法。

另一种可能更可靠并且在其他情况下也有帮助的解决方案是直接访问程序集

$sysManagement = [System.Reflection.Assembly]::LoadWithPartialName("System.Net");
$netType = $sysManagement.GetType("System.Net.WebRequest",$true);
$netType::Create("http://etc.com")