powershell可以从外部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会返回数据而不会出现问题

Import-module("C:tempMathFunctions.dll")
[MathFunctions.MultiClass]::Multiply(10, 2)

按预期返回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访问子类。

我确信可以访问子类,最接近的例子是:PowerShell IComparable与子类但我看不出他是怎么把它别名的。

感谢

感谢布鲁夫为我指明了正确的方向。

我最终用dotPeek把dll拆开了(现在它已经公开了[脸红](。

代码如上所述,powershell方法只是子类名称:

[MathFunctions.Add]::MultiplyAndAdd(5,2,3)

它给出了一个答案,而不是错误

要更详细地解释混乱:

您错误地认为类继承关系必须反映在给定类的完整(命名空间限定的(类型名称中,因此您认为因为类Add派生自MultiClass,所以MultiClass也必须反映在完整类型名称中。

实际上,类的派生与其全名无关;所有重要的是它所在的命名空间。换句话说:要形成任何类型(类(的完整类型名称,请使用
<EnclosingNamespace>.<TypeName>
[1],在您的情况下,这意味着:

MathFunctions.Add

使用它作为PowerShell类型的文字[MathFunctions.Add],可以通过静态成员访问运算符::访问静态MultiplyAndAdd()方法,如您自己的答案所示。


此外,请记住选项卡完成在这里可能很有帮助,因为它也适用于类型名称;在您的情况下,键入[Add<tab>将扩展到[MathFunctions.Add,生成完整的类型名称。(如果多个可用(公共(类型名称以Add开头,则可能需要反复按tab键才能循环显示匹配项。(


[1]访问嵌套类需要一个变体,即嵌入另一个类中的类:
<EnclosingNamespace>.<EnclosingTypeName>+<NestedTypeName>,例如,如果您的Add类有一个名为Inner的嵌套类:

最新更新