【发布时间】:2021-02-24 20:45:29
【问题描述】:
环境:Win 10 64位,PS 7.1版
我有一个模块,我决定将所有内容都移到基于类中。要使用程序集,我需要通过解决方法 psd1 文件加载 .dll 等。
看帖后:Powershell: Unable to find type when using PS 5 classes
**根据@mklement0 的评论,.dll 无法像组件“System.Windows.Forms”一样加载
根据@mklement0 的建议进行了更新,但仍然无效 这是更新后的样子:
H:\PowerShell\Modules\TestUtils
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2/26/2021 6:25 AM 4168 TestUtils.psd1
-a--- 2/26/2021 6:22 AM 449 TestUtils.psm1
TestUtils.psd1 是由命令创建的:
New-ModuleManifest TestUtils.psd1 -RootModule TestUtils.psm1 .psm1中的内容如下:
Add-Type -name NativeMethods -namespace Win32 -MemberDefinition @'
[DllImport("user32.dll")]
public static extern void mouse_event(int flags, int dx, int dy, int cButtons, int info);
[DllImport("user32.dll")]
public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);
'@
Class MyWinUtils
{
Static [Void] ClickLeftMouse([int]$x,[int]$y)
{
[Win32.NativeMethods]::mouse_event(6,0,0,0,0)
}
}
当我加载模块时弹出错误:
using module TestUtils
InvalidOperation: At TestUtils.psm1:15 char:5
+ [Win32.NativeMethods]::mouse_event(6,0,0,0,0)
+ ~~~~~~~~~~~~~~~~~~~
Unable to find type [Win32.NativeMethods].
谢谢
【问题讨论】:
-
PS 5.1 中的 FWIW 我有 psm1 文件,其中包含类,当您使用
using module语法而不是Import-Module时,它们可以正常加载。 -
我总是使用 Add-Type -TypeDefinition
添加 Win32 类型。我还看到 C# 代码缺少使用 PInvoke 所需的 using 语句(DllImport 需要 System.Runtime.InteropServices。) -
@bluuf,不必 必须添加这些
using语句并且不必 不必显式定义封闭类是-MemberDefinition的便利提供 - 它的主要用途是促进公开基于 P/Invoke 的方法。
标签: powershell