【问题标题】:How to Inherit from a .net class in Powershell [duplicate]如何从Powershell中的.net类继承[重复]
【发布时间】:2018-06-04 00:30:42
【问题描述】:

以下代码在 ISE 中执行时运行良好:

class MyWindow : Windows.Window {
}
# for testing purposes this is the whole script

但是在没有 ISE 的情况下运行时会导致错误:

At C:\Users\Thelonius\git\ps-scripts\minimal.ps1:1 char:18
+ class MyWindow : Windows.Window {
+                  ~~~~~~~~~~~~~~
Unable to find type [Windows.Window].
    + CategoryInfo          : ParserError: (:) [], ParseException
    + FullyQualifiedErrorId : TypeNotFound

当我通过 .\minimal.ps1 在新的 Powershell 窗口中运行它时,错误是相同的。在 shell 中执行 Add-Type -AssemblyName PresentationFramework 后,.\minimal.ps1 运行没有错误。由于在解析脚本时发生错误,因此无法将Add-Type 命令添加到脚本中。据我了解,using assembly PresentationFramework 应该可以完成这项工作。但它没有(在 5.0 和 5.1 中都没有)。

那么有没有一种理智的方法可以让它在不通过 Powershell 命令行选项或类似丑陋的东西加载程序集的情况下工作?

【问题讨论】:

  • 如果真的没有办法在单个文件中做到这一点,@PetSerAl 似乎是正确的。即使使用带有powershell.exe -c "Add-Type -AssemblyName PresentationFramework; & .\minimal.ps1" 之类的.lnk 文件,对我来说似乎也比处理多个文件更优雅。
  • 这是Add-Type 的全部内容。为什么它不完全适合你?
  • @TheIncorrigible1:因为Add-Type是在runtime执行的,对于class的定义来不及看到类型,因为它处理得比较早,在解析时间
  • @TNT:确实,using assembly应该完成这项工作,但还没有 - 请参阅stackoverflow.com/a/51255643/45375
  • @TheIncorrigible1:你可以这样想,是的:与函数不同,类在执行开始时已经被解析;试试[Foo]::new().Bar(); class Foo { [string] Bar() { return 'hi' } }

标签: .net powershell class


【解决方案1】:

首先在您的控制台中使用Add-Type

首先从 ISE 获取组装路径:

[System.Windows.Window].Assembly

然后在控制台中使用Add-Type和位置路径:

在我的系统中是:

Add-Type -Path 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\PresentationFramework\v4.0_4.0.0.0__31bf3856ad364e35\PresentationFramework.dll'

然后就可以了

【讨论】:

  • 这是很好的信息,但是,您能建议一种从其他用户的计算机获取此信息的方法吗?
  • 我不明白优势是什么。错误发生在Add-Type执行之前。
  • @TNT 然后在脚本文件的开头添加它
  • 我建议在尝试继承之前将Add-Type -AssemblyName PresentationFramework 放在他的脚本中。您不需要做所有额外的工作来查找程序集所在的位置。
  • @avshalom 问题是必须在添加类型之前定义类。我过去遇到过这个问题,我发现的唯一解决方案是使用多个脚本文件(或使用反射创建类)
猜你喜欢
  • 2021-03-15
  • 2020-04-28
  • 2012-06-17
  • 2012-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-01
  • 1970-01-01
相关资源
最近更新 更多