创建C# dll以及在PowerShell中使用方法

4

我创建了一个简单的 C# dll,并使用 RegAsm.exe 注册了它。其中有一个非常简单的方法,不带参数并返回一个数字,以下是一个简化版本。

namespace AVL_test {
    interface ITestClass {
        int GetNumber();
    }

    [ComVisible(true)]
    public class TestClass: ITestClass {
        public TestClass() { }

        public int GetNumber() {
            return 10;
        }
    }
}

我需要从PowerShell调用该方法,因此我添加了类型。

Add-Type -Path "C:\myPath\AVL_test.dll"

似乎已经加载,因为如果我使用[AVL_test.TestClass],我会得到以下输出:

IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True False TestClass System.Object

但是,如果我尝试通过键入[AVL_test.TestClass]::GetNumber()来调用GetNumber(),我会得到以下错误:

方法调用失败,因为[AVL_test.TestClass]不包含名为“GetNumber”的方法。

我做错了什么吗?
1个回答

10

你的方法应该是静态的,或者你需要创建该类型(TestClass)的实例。

可以使用以下方式进行创建:

New-Object -TypeName <full qualified type name> -ArgumentList <args>

在您的特定情况下:
$test = New-Object -TypeName AVL_Test.TestClass
$test.GetNumber()

是否有一种方法可以在指定接口时实现静态方法?如果我尝试将方法更改为public static int GetNumber(),则会出现错误,指出“'AVL_test.TestClass.GetNumber()'无法实现接口成员,因为它是静态的”。 - Naigel
不,如果像你的例子中一样有一个接口,那么方法就不能被声明为静态的... - Markus
1
另外,我认为在PowerShell交互中不需要[ComVisible]属性。只有在将程序集注册为COM对象时才需要使用该属性,但是PowerShell可以本地加载.NET类型和程序集。 - PeterK
对于接口问题:你可以添加一个静态方法,由接口方法调用 - 只是为了提供两种场景... - Markus
不错。使用PowerShell二进制模块是否可以获得相同的返回值?即包含/继承自cmdlet类的返回值。 - Sam Tran

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接