Powershell可以从外部C#dll调用子类

时间:2018-12-15 12:12:00

标签: powershell dll subclass

我有一些简单的代码来自: 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:\temp\MathFunctions.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 with subclasses 但我看不出他是怎么给它起别名的。

谢谢

2 个答案:

答案 0 :(得分:0)

谢谢bluuf向我指出了正确的方向。

我最终使用dotPeek将dll拆开了(现在它是公共的[blush])。

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

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

给出了答案-不是错误

答案 1 :(得分:0)

要详细解释混乱之处,

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

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

 MathFunctions.Add

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


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


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