powershell可以从外部C#dll调用子类吗
Can powershell call subclasses from external C# dll
我有一些简单的代码来自:
https://www.codeguru.com/csharp/csharp/cs_misc/dllsandexecutables/article.php/c4239/Creating-and-Using-C-DLLs.htm
它生成一个 dll 来做一些简单的数学运算。我想添加一个子类
namespace MathFunctions
{
public class Add : MultiClass
{
public static int MultiplyAndAdd(int a, int b, int c)
{
return (a * b) + c;
}
}
}
然后从 powershell 调用它。
运行 powershell against the master 类 returns 数据返回没有问题
Import-module("C:\temp\MathFunctions.dll")
[MathFunctions.MultiClass]::Multiply(10, 2)
returns 20 符合预期,但我无法确定访问子类的格式。我试过以下版本:
[MathFunctions.MultiClass.Add]::MultiplyAndAdd(10, 2, 3)
[MathFunctions.MultiClass+Add]::MultiplyAndAdd(10, 2, 3)
[MathFunctions.MultiClass]:Add:MultiplyAndAdd(10, 2, 3)
[MathFunctions.MultiClass]::Add.MultiplyAndAdd(10, 2, 3)
但我总是在
上得到变化
Unable to find type [MathFunctions.MultiClass.Add]
我也在 powershell 中通过以下方式寻找方法:
[MathFunctions.MultiClass] | get-member -MemberType method
但我的子类没有列出。
我知道我访问不正确。我不知道如何从 powershell 访问子类。
我很确定 sub类 可以访问,最接近的例子是:
但我看不出他是怎么取别名的。
谢谢
谢谢 bluuf 为我指明了正确的方向。
我最终使用 dotPeek 将 dll 拆开(现在是 public [脸红])。
代码如上,powershell方法只是子类名:
[MathFunctions.Add]::MultiplyAndAdd(5,2,3)
给出了答案 - 不是错误
更详细地解释混淆:
您错误地认为 class-继承关系必须反映在给定的 class' 完整(命名空间限定的)类型名称中,因此您认为因为 class Add
派生自 class MultiClass
,所以 MultiClass
也必须反映在完整的类型名称中.
实际上,a class'的推导与其全名无关;重要的是它所在的命名空间。
换句话说:要形成任何类型的完整类型名称 (class),请使用
<EnclosingNamespace>.<TypeName>
[1] ,在你的例子中意味着:
MathFunctions.Add
将其用作 PowerShell 类型文字 - [MathFunctions.Add]
- 允许您通过静态成员访问运算符 ::
访问静态 MultiplyAndAdd()
方法,如您自己的所示回答。
此外,请记住 tab-completion 在这里可能会有帮助,因为它也适用于类型名称;在您的情况下,键入 [Add<tab>
将扩展为 [MathFunctions.Add
,生成完整的类型名称。
(如果有多个可用 (public) 类型名称以 Add
开头,您可能需要反复按 Tab 键才能循环匹配。)
[1] 需要变体才能访问 nested class,即嵌入另一个 class:
的 class
<EnclosingNamespace>.<EnclosingTypeName>+<NestedTypeName>
,例如,如果您的 Add
class 有一个名为 Inner
的嵌套 class:
MathFunctions.Add+Inner
我有一些简单的代码来自: https://www.codeguru.com/csharp/csharp/cs_misc/dllsandexecutables/article.php/c4239/Creating-and-Using-C-DLLs.htm
它生成一个 dll 来做一些简单的数学运算。我想添加一个子类
namespace MathFunctions
{
public class Add : MultiClass
{
public static int MultiplyAndAdd(int a, int b, int c)
{
return (a * b) + c;
}
}
}
然后从 powershell 调用它。
运行 powershell against the master 类 returns 数据返回没有问题
Import-module("C:\temp\MathFunctions.dll")
[MathFunctions.MultiClass]::Multiply(10, 2)
returns 20 符合预期,但我无法确定访问子类的格式。我试过以下版本:
[MathFunctions.MultiClass.Add]::MultiplyAndAdd(10, 2, 3)
[MathFunctions.MultiClass+Add]::MultiplyAndAdd(10, 2, 3)
[MathFunctions.MultiClass]:Add:MultiplyAndAdd(10, 2, 3)
[MathFunctions.MultiClass]::Add.MultiplyAndAdd(10, 2, 3)
但我总是在
上得到变化Unable to find type [MathFunctions.MultiClass.Add]
我也在 powershell 中通过以下方式寻找方法:
[MathFunctions.MultiClass] | get-member -MemberType method
但我的子类没有列出。
我知道我访问不正确。我不知道如何从 powershell 访问子类。
我很确定 sub类 可以访问,最接近的例子是:
谢谢
谢谢 bluuf 为我指明了正确的方向。
我最终使用 dotPeek 将 dll 拆开(现在是 public [脸红])。
代码如上,powershell方法只是子类名:
[MathFunctions.Add]::MultiplyAndAdd(5,2,3)
给出了答案 - 不是错误
更详细地解释混淆:
您错误地认为 class-继承关系必须反映在给定的 class' 完整(命名空间限定的)类型名称中,因此您认为因为 class Add
派生自 class MultiClass
,所以 MultiClass
也必须反映在完整的类型名称中.
实际上,a class'的推导与其全名无关;重要的是它所在的命名空间。
换句话说:要形成任何类型的完整类型名称 (class),请使用 <EnclosingNamespace>.<TypeName>
[1] ,在你的例子中意味着:
MathFunctions.Add
将其用作 PowerShell 类型文字 - [MathFunctions.Add]
- 允许您通过静态成员访问运算符 ::
访问静态 MultiplyAndAdd()
方法,如您自己的所示回答。
此外,请记住 tab-completion 在这里可能会有帮助,因为它也适用于类型名称;在您的情况下,键入 [Add<tab>
将扩展为 [MathFunctions.Add
,生成完整的类型名称。
(如果有多个可用 (public) 类型名称以 Add
开头,您可能需要反复按 Tab 键才能循环匹配。)
[1] 需要变体才能访问 nested class,即嵌入另一个 class:
的 class
<EnclosingNamespace>.<EnclosingTypeName>+<NestedTypeName>
,例如,如果您的 Add
class 有一个名为 Inner
的嵌套 class:MathFunctions.Add+Inner