- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有人可以解释这种方法与 Add-Type 之间的区别吗
$definition = [Text.StringBuilder]""
[void]$definition.AppendLine('[DllImport("user32.dll")]')
[void]$definition.AppendLine('public static extern int LoadString(IntPtr h, uint id, System.Text.StringBuilder sb, int maxBuffer);')
[void]$definition.AppendLine('[DllImport("kernel32.dll")]')
[void]$definition.AppendLine('public static extern IntPtr LoadLibrary(string s);')
Add-Type -memberDefinition:$definition.ToString() -name:Utility -namespace:PxTools
Add-Type -typeDefinition @"
public class BasicTest
{
public static int Add(int a, int b)
{
return (a + b);
}
public int Multiply(int a, int b)
{
return (a * b);
}
}
"@
$targetFile = "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Accessories\Snipping Tool.lnk"
$action = 'PinToTaskbar'
$verbs = @{
'PinToStartMenu' = 5381
'UnpinFromStartMenu' = 5382
'PinToTaskbar' = 5386
'UnpinFromTaskbar' = 5387
}
try {
$type = [type]"PxTools.Utility"
} catch {
$definition = [Text.StringBuilder]""
[void]$definition.AppendLine('[DllImport("user32.dll")]')
[void]$definition.AppendLine('public static extern int LoadString(IntPtr h, uint id, System.Text.StringBuilder sb, int maxBuffer);')
[void]$definition.AppendLine('[DllImport("kernel32.dll")]')
[void]$definition.AppendLine('public static extern IntPtr LoadLibrary(string s);')
Add-Type -memberDefinition:$definition.ToString() -name:Utility -namespace:PxTools
}
if ($script:Shell32 -eq $null) {
$script:Shell32 = [PxTools.Utility]::LoadLibrary("shell32.dll")
}
$maxVerbLength = 255
$verb = new-object Text.StringBuilder "", $maxVerbLength
[void][PxTools.Utility]::LoadString($script:Shell32, $verbs.$action, $verb, $maxVerbLength)
$verbAsString = $verb.ToString()
try {
$path = Split-Path $targetFile -parent -errorAction:stop
$file = Split-Path $targetFile -leaf -errorAction:stop
$shell = New-Object -com:"Shell.Application" -errorAction:stop
$folder = $shell.Namespace($path)
$target = $($folder.Parsename($file)).Verbs() | Where-Object {$_.Name -eq $verbAsString}
$target.DoIt()
Write-Host "$($action): $file"
} catch {
Write-Host "Error managing shortcut"
}
Add-Type -memberDefinition:@"
[DllImport("user32.dll")]
public static extern int LoadString(IntPtr h, uint id, System.Text.StringBuilder sb, int maxBuffer);
[DllImport("kernel32.dll")]
public static extern IntPtr LoadLibrary(string s);
"@ -name:Utility -namespace:PxTools
$script:Shell32
位需要像这样处理,或者它不能被卷入类型吗?而且,原来的全局范围(我改为脚本范围)真的有必要吗?在我看来,除非我这样做数百次,否则多次调用 LoadLibrary 不会有什么大不了的?
最佳答案
:
将参数名称与其值分开是可行的,但不寻常;通常,使用空格(例如,
-name Utility
而不是
-name:Utility
)。
[System.Text.StringBuilder]
在类型定义中。
[System.Text.StringBuilder]
的唯一原因。在 PowerShell 中,如果性能是最重要的,并且您需要从动态创建的片段中构建一个非常大的字符串。
[System.Text.StringBuilder]
在
sb
LoadString()
的参数Windows API 函数是必须的,因为它是一个接收字符串的输出参数,而
[string]
类型是不可变的。
[DllImport(...
与
-MemberType
一方面,自定义类型定义(
class BasicTest ...
)和
-TypeDefinition
另一方面(有关这两种方法的背景信息,请参阅本文底部)。
script
范围:
script
是脚本内部的默认范围,因此在脚本的顶层,您创建的所有变量都是隐式脚本范围的;因此,
$script:Shell32 = ...
实际上与
$Shell32 = ...
相同在脚本的顶级范围内。您甚至可以从函数内部引用该脚本级变量,就像
$Shell32
(尽管为了清楚起见,您可能希望使用
$script:Shell32
)。您唯一需要的时候
$script:
范围限定符是如果您创建了本地
$Shell32
隐藏脚本级别的变量(例如,隐式地,只需分配给
$Shell32
)。
Add-Type -TypeDefinition
的辅助类。 P/Invoke 签名集成到其中(不需要单独的 Add-Type -MemberDefinition
调用)。GetVerbName()
.请注意,我已经删除了 public
访问修饰符从 P/Invoke 签名使它们私有(private),因为它们现在只在类内部需要。 "shell32.dll
DLL 每次调用,但我不希望这是一个明智的性能问题。 Shell.Application
COM 对象)。如果你这样做了,并实现了,比如 PinToTaskBar
静态方法,你可以简单地引用 [PxTools.TaskBarStartMenuHelper]::PinToTaskBar()
从脚本中的任何位置,甚至不必担心脚本级变量。 $verbs
带有清洁器的哈希表 Enum
定义,但请注意,这仅适用于 PSv5+。 Enum TaskBarStartMenuVerbs {
PinToStartMenu = 5384
UnpinFromStartMenu = 5385
PinToTaskbar = 5386
UnpinFromTaskbar = 5387
}
Add-Type -TypeDefinition @'
using System;
using System.Runtime.InteropServices;
using System.Text;
namespace PxTools {
public class TaskBarStartMenuHelper {
[DllImport("user32.dll")]
static extern int LoadString(IntPtr h, uint id, System.Text.StringBuilder sb, int maxBuffer);
[DllImport("kernel32.dll")]
static extern IntPtr LoadLibrary(string s);
[DllImport("kernel32.dll")]
static extern bool FreeLibrary(IntPtr h);
public static string GetVerbName(uint verbId) {
IntPtr h = LoadLibrary("shell32.dll");
const int maxLen = 255;
var sb = new StringBuilder(maxLen);
LoadString(h, verbId, sb, maxLen);
FreeLibrary(h);
return sb.ToString();
}
}
}
'@
# This returns 'Pin to tas&kbar' on a US English system.
[PxTools.TaskBarStartMenuHelper]::GetVerbName([TaskBarStartMenuVerbs]::PinToTaskbar)
Add-Type
在 session 中重复,只要类型定义没有改变。后续调用实际上是一种快速且无声的空操作。
Add-Type
会失败,但这是可取的,因为您想确保使用的是您想要的类型。
Get-Help Add-Type
.
AddType -MemberDefinition ... -Name ... -NameSpace
通常用于传递 包含公共(public)的字符串 P/Invoke签名那个允许访问 native 代码,例如 Windows API 函数 通过自定义 辅助类将它们暴露为 静态方法 .[PxTools.Util]
使用静态方法创建 [PxTools.Util]::LoadString()
和 [PxTools.Util]::LoadLibrary()
调用底层的 Windows API 函数。 -MemberDefinition
通常与 P/Invoke 签名一起使用,但不限于此,因为 -MemberDefinition
只是将指定字符串包装在公共(public)类中的语法糖(有关详细信息,请参见下文)。因此,您可以传递任何在 class
中有效的内容。主体,例如属性和方法定义,作为更简洁地定义自定义类的一种方式,而不必包含显式 namespace
和 class
块。class
已创建,因此您不能使用此方法定义 struct
, 例如;此外,您不能使用 using
直接陈述;相反,通过 -UsingNamespace
传递命名空间范围。 -NameSpace
value 将类型放入命名空间 Microsoft.PowerShell.Commands.AddType.AutoGeneratedTypes
,这意味着您必须将其称为 [Microsoft.PowerShell.Commands.AddType.AutoGeneratedTypes.<yourTypeName>]
(注意这与没有 -TypeDefinition
shell 的 namespace <name> { ... }
命令有何不同 - 见下文)。 Add-Type -TypeDefinition ...
- 用于定义自定义类型(类)通过 包含 C# 源代码的字符串 (默认情况下;也支持 VisualBasic 和 JScript)。class
, delegate
, enum
, interface
, 或 struct
定义,通常包含在命名空间声明中。[BasicTest]
创建(没有命名空间限定,因为源代码字符串中的类型定义未包含在 namespace <name> { ... }
中),使用静态方法 Add
和实例方法 Multiply
. public
以便从 PowerShell 访问。
-MemberDefinition
语法本质上只是语法糖 因为它会自动为
提供一个围绕 P/Invoke 签名的类包装器。在您想直接调用它们的情况下促进对 native DLL 调用的访问 来自 PowerShell 而不是在用
Add-Type -TypeDefinition
定义的自定义类型内部使用它们.
-MemberDefinition
称呼:
Add-Type -Namespace PxTools -Name Utility -MemberDefinition @'
[DllImport("user32.dll")]
public static extern int LoadString(IntPtr h, uint id, System.Text.StringBuilder sb, int maxBuffer);
[DllImport("kernel32.dll")]
public static extern IntPtr LoadLibrary(string s);
[DllImport("kernel32.dll")]
public static extern bool FreeLibrary(IntPtr h);
'@
-TypeDefinition
的语法糖称呼:
Add-Type -TypeDefinition @'
using System;
using System.Runtime.InteropServices;
namespace PxTools {
public class Utility {
[DllImport("user32.dll")]
public static extern int LoadString(IntPtr h, uint id, System.Text.StringBuilder sb, int maxBuffer);
[DllImport("kernel32.dll")]
public static extern IntPtr LoadLibrary(string s);
[DllImport("kernel32.dll")]
public static extern bool FreeLibrary(IntPtr h);
}
}
'@
Add-Type -MemberDefinition
:
-Name
) 中具有指定名称 ( -NameSpace
) 的公共(public)类中,以便这些方法可以作为该类的静态方法调用,如 [<NameSpace>.<Name>]::<Method>(...)
using
直接陈述;相反,通过 -UsingNamespace
传递命名空间范围。 using
声明 需要支持编译 P/Invoke 签名。 关于.net - 添加类型变化 : -MemberType vs. -TypeDefinition 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40296537/
嘿伙计们。 实现背景变化(基本上是幻灯片放映)和过渡效果的常见方法有哪些。我想每隔一段时间改变complte文档背景。 我是一名 ASP.net 开发人员,并且希望大部分内容都可以在 ASP 中实现。
也许,指针已经在修改过程中指向 auto_ptr 的常规指针指向 unique_ptr 和 shared_ptr 我只是想知道已经开发出来的新型指针是否完全覆盖了旧版本(或者您可能认为存在内存泄漏问题
我使用 Android Studio 构建 Android 应用。 我的问题是:当 fragment 改变时,应用程序崩溃。 控制台输出[控制台] 01-06 18:35:21.952 27756-
****澄清**我做了这个 [Fiddle] ( http://jsfiddle.net/sggPv/10/ ) 来帮助澄清情况。 该脚本起初适用于两个表格,但随后当您点击 slider 并将新表格加
我有图标,单击它会将新的 div(列)添加到 div 容器。问题是,当新的 div(列)出现时,按钮不会向右移动。是否可以以某种方式仅在 div 内添加 position:fixed? 这是我的几个屏
我是 Java 新手,继承了现有的 Android 应用程序。原始开发人员选择使用常量接口(interface)。 我的问题是我需要更改其中一些常量来编译生产应用程序与开发应用程序。如果我手动修改一些
在 Apple developer Document 中,我在 UIColor 中发现了一些新东西。 If your app was linked on or after iOS 10 and whe
我没有经常使用 ShareKit,但我只想拥有三个共享选项:Facebook、Twitter 和电子邮件。 ShareKit 提供了更多选项,包括更多按钮。但是,我不想要“更多”选项,只想要三个。 在
我正在构建一个 JS 库,其中一个用例要求我在 DOM 更改时触发一个事件,特别是如果它是一个单页应用程序,例如:github search bar 经过一番研究,我遇到了MutationObserv
我已经设法编写了一个代码来检测任何工作表中特定单元格的值变化,但我一直在努力构建检测和跟踪范围(值)变化的东西。 例如,如果用户决定复制和粘贴某个范围的数据(假设超过 1 个单元格),它不会被宏捕获。
使用 ffmpeg ,我们可以对音频电平进行多少控制?例如,我想在程序的时间轴上映射一个“M”形: t0 - t1 : fade in from 0 to 1 t1 - t2 : play at fu
使用 jQuery 1.7.1,我尝试为下拉列表上的更改事件创建一个事件处理程序。下拉列表会动态添加到 DOM 中。似乎在大多数浏览器上都能很好地工作,但是哦,奇怪的 IE8 想要变得困难。有解决方法
我想制作一个具有可选边框大小的自定义控件。请参阅下面的代码。边框绘制在非客户区,其宽度可以是 0、1 或 2 像素。我已经在 WM_NCPAINT 中成功完成了边框绘制。问题是,在更改控制边框大小的属
我知道这个问题之前已经被问过,而且我实际上已经找到了一些我已经实现的解决方案。不幸的是,我没能得到我想要的。 我以前没有做过AngularJS,我想做的是: 检测网址何时更改 根据网址更改的内容进行一
我有一个 auto-carousel 指令,它循环访问链接元素的子元素。 但是,子级尚未加载到 DOM 中,因为它们的 ng-if 表达式尚未解析。 如何确保父指令知道其 DOM 树已发生更改?
我有一个流程可以通过内容提供商从数据库中获取数据。 fun getDataFlow(): Flow { return flow { emit(Result.Loading)
我有一些有效的代码,但有时它只是“跳转”到其他文本而不考虑间隔。 该代码基本上按时间间隔更改标题的文本。 var text = ["text1", "text2", "text3","text4","
我正在尝试将 onCLick 监听器添加到我的 PreferenceScreen 上的开关,但它不起作用。我尝试了 Java 教程中的代码并将其转换为 Kotlin,但由于某种原因它无法正常工作。 这
我们目前正在尝试升级我们的程序使用的 ffmpeg 版本。跳跃很大,因为我们目前使用的是 ffmpeg 0.8,最新版本是 1.2。 在这些测试中,我使用的是(让我说)我发现的令人惊叹的软件包 her
我有一个流程可以通过内容提供商从数据库中获取数据。 fun getDataFlow(): Flow { return flow { emit(Result.Loading)
我是一名优秀的程序员,十分优秀!