Powershell 不加载 System.Net.Http 程序集并忽略脚本中的 Add-Type

Powershell doesn't load System.Net.Http assembly and ignore Add-Type within script

我正在尝试将 HttpClient 与自定义 HttpClientHandler 一起使用(以修复无法通过重定向正确管理的 Cookie 问题)。

两者都进入 System.Net.Http 程序集(和命名空间)并且 Powershell(和 ISE)大部分时间看不到 classes(也不是命名空间)。

它确实找到了一个 class System.Net.Http(实际上它是 WebRequestMethods.Http),我不会感到惊讶,它会破坏一切。

所以我创建了这个 KISS 示例:

using namespace System.Net.Http

class Wtf : HttpClientHandler {
}

$t = [HttpClient]::new()

如果我运行它,它会告诉我该类型不存在。 (如果我使用完整的命名空间而不是 using,它也会这样做)。

然而有趣的是接下来会发生什么。 如果我在 ISE 中使用相同的代码,IDE 只会告诉我找不到基 class HttpClient。 (与实例化无关)

我发现Add-Type可以帮到我,所以我补充

Add-Type -AssemblyName System.Net.Http

Write-Host "Hello World"

介于 using namespace System.Net.Httpclass Wtf : HttpClientHandler {

之间

我在尝试 运行 时仍然遇到同样的错误 - 但我根本看不到我的 "Hello World"! 所以它在解析它时似乎失败了,它甚至没有尝试 运行 它。 ISE 仍然在 IDE.

中显示相同的错误

然后,如果我 运行 Add-Type -AssemblyName System.Net.Http 在再次 运行 脚本之前(从 PowerShell 提示符或 ISE),一切 运行 都没有问题。 同样从那时起,ISE IDE 智能感知可以列出 System.Net.Http 命名空间中的所有内容。

那么,用户如何才能只启动我的 PowerShell 脚本,而不必同时启动 运行 Add-Type 和我的脚本?

我在 Win10 上使用 PS 5.1,我是 PowerShell 环境的新手,尽管我有 C# 背景。

EDIT1: 使用 HttpClientHandler 而不是 HttpClient(但不管问题是什么)

EDIT2: 这是我现在正在使用的

using assembly System.Net.Http
using namespace System.Net.Http

class Test : HttpClient {
}

[HttpClient]::new()

这是输出:

Au caractère C:\Users[=14=]xdcdcdcd\Desktop\Test.ps1:4 : 14
+ class Test : HttpClient {
+              ~~~~~~~~~~
Type [HttpClient] introuvable.
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : TypeNotFound
# test.ps1
Add-Type -AssemblyName System.Net.Http

class Test : system.Net.Http.HttpClient {
}


At C:\users\admin\test.ps1:3 char:14
+ class Test : system.Net.Http.HttpClient {
+              ~~~~~~~~~~~~~~~~~~~~~~~~~~
Unable to find type [system.Net.Http.HttpClient].
    + CategoryInfo          : ParserError: (:) [], ParseException
    + FullyQualifiedErrorId : TypeNotFound

我明白了。它在脚本中不起作用,这太疯狂了。我相信这里提供了一些解决方案:

编辑: 实际上,这在 PS 6 中对我有用。如果你在 Windows 10 1809,很多命令在 PS 6 中再次工作。

So how can a user only start my PowerShell script instead of having to both run Add-Type and my script?

高级 PowerShell 脚本以一些 using 语句开头是很常见的,因此您可以这样开始您的脚本:

using assembly System.Net.Http
using namespace System.Net.Http
#your code here

但大多数时候,在现代 PowerShell 中,尤其是对于 Web 命令,您可以而且应该从使用 PowerShell cmdlet 开始。

那么我的问题是您希望使用 HttpClient 做什么?让我知道您想做什么,我很乐意向您展示 'PowerShell' 的方法:)