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.Http
和 class 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' 的方法:)
我正在尝试将 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.Http
和 class 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' 的方法:)