【问题标题】:Create C# dll and use method with powershell创建 C# dll 并使用 powershell 方法
【发布时间】:2015-07-17 18:51:58
【问题描述】:

我创建了一个简单的 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 名称 BaseType
-------- -------- ---- --------
True False TestClass System.Object

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

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

我做错了吗?

【问题讨论】:

    标签: c# powershell dll


    【解决方案1】:

    您的方法应该是static 或者您需要创建该类型的实例(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()' cannot implement an interface member because it is static
    • 不,如果您的示例中有接口,则不能将方法声明为静态 ...
    • 在相关说明中,我认为 PowerShell 交互不需要 [ComVisible] 属性。仅当您将程序集注册为 COM 对象时才需要它,但 PowerShell 将在本机加载 .NET 类型和程序集。
    • 对于接口问题:您可以添加一个静态方法,由接口方法调用 - 只是为了提供两种方案......
    • 不错。是否可以使用 PowerShell 二进制模块获得相同的返回值? IE。包含/继承自 cmdlet 类的一种。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    • 2013-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多