我正在通过Runspace
和Pipeline
从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>
}
答案 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")