2015-05-07 15 views
0

我創建了一個簡單的C#dll並使用RegAsm.exe進行了註冊。一個非常簡單的方法是不帶參數調用並返回一個數字,這裏是一個簡化版本。創建C#dll並使用powershell的方法

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」。

我做錯了什麼?

回答

5

您的方法應該是static或者您需要創建該類型的實例(TestClass)。

最後是可以做到用

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

或者在您的具體情況:

$test = New-Object -TypeName AVL_Test.TestClass 
$test.GetNumber() 
+0

有沒有實現靜態方法,如果我指定接口的方法嗎?如果我嘗試將方法更改爲'public static int GetNumber()'我得到一個錯誤,說'AVL_test.TestClass.GetNumber()'無法實現接口成員,因爲它是靜態的' – Naigel

+0

不,如果有一個接口你的例子,比方法不能聲明爲靜態... – Markus

+1

在相關說明,我不認爲'[ComVisible]'屬性是PowerShell交互所必需的。如果您將程序集註冊爲COM對象,則只需要此方法,但PowerShell將本機加載.NET類型和程序集。 – PeterK