2013-05-08 46 views
2

我有我們的過程控制應用程序的dll程序集,它使用我的powershell腳本中的負載。Powershell呼叫彙編代表

的DLL包含我需要使用,代表姓名,委託類型:

"X.Y.Delegate" 

我在該DLL應該叫這樣的一種方法:

Method(delegatetype CallbackMethod) 

所以,我需要:

  1. 在我的腳本中爲"X.Y.Delegate"定義了一個委託,例如,這樣,當一個進程事件被觸發」

注意它被調用Ë$MyDelegate

  • 定義一個回調方法:對不起,如果我的問題似乎是愚蠢的,我是一個絕對的初學者。

  • +0

    你是什麼實際問題?你是問如何實現這些或者哪些選項被認爲更好的信息? – masrtis 2013-05-08 18:50:20

    +0

    感謝您的回覆:)我正在使用它來最大限度地減少資源消耗。而不是每分鐘檢查10000個標記值,檢查哪些內容已經更改,我可以訂閱事件處理程序,創建自己的腳本塊以便在事件發生時執行。這樣我就不會掃描我的10000個標籤,只要發生了一些變化,我就會被回覆。這是我對這個話題的理解,如果我錯了,我會很感激,如果你糾正我。再次感謝。 – 2013-05-09 08:02:07

    回答

    1

    更新:

    閱讀您的評論,並更緊密地閱讀你的問題,我想你可能會尋求利用異步事件處理。下面是一個例子,它監聽事件,直到超時,然後退出。這個例子假設你可以改變你的程序集來添加一個事件。

    產生事件類:

    namespace ClassLibrary1 
    { 
    public class Class1 
    { 
        public event EventHandler SomeEvent; 
    
        protected void OnSomeEvent(EventArgs e) 
        { 
        var someEvent = SomeEvent; 
    
        if (someEvent != null) 
        { 
        SomeEvent(this, e); 
        } 
    } 
    
    public void SomeMethod() 
    { 
        Task.Run(() => 
        { 
        for (int i = 0; i < 3; i++) 
        { 
        Thread.Sleep(3000); 
        OnSomeEvent(EventArgs.Empty); 
        } 
        }); 
        } 
    } 
    } 
    

    PowerShell的:

    # Load up your .net assembly 
    add-type -path .\Class1.cs 
    
    $x = new-object ClassLibrary1.Class1 
    
    $sourceIdentifier = "SomeEvent" 
    
    # Register event 
    $eh = Register-ObjectEvent -SourceIdentifier $sourceIdentifier -InputObject $x -EventName SomeEvent 
    
    $x.SomeMethod() 
    
    while ($true) 
    { 
    Write-Host "Waiting for event..." 
    $event = Wait-Event -SourceIdentifier $sourceIdentifier -Timeout 10 
    
    if ($event -eq $null) 
    { 
        Write-Host "No event received for 10 seconds." 
        break 
    } 
    
    # Do processing here 
    Write-Host "Processing event..." 
    $event 
    
    # Remove event from queue 
    Remove-Event -SourceIdentifier $sourceIdentifier 
    } 
    
    Unregister-Event -SourceIdentifier $sourceIdentifier 
    Write-Host "Done processing events." 
    
    +0

    非常感謝,它工作。我認爲這個想法是封裝要執行的塊的變量「ScriptBlock」。當我的應用程序開始回調scriptblock時,Powershell停止響應,但現在我可以在應用程序服務器日誌中看到該處理程序啓動,處理程序對象已發送,這意味着我處於正確的方向。您能否告訴我腳本執行完後,powershell如何響應我的應用程序回調?我在ISE上運行腳本,調試時,當我的應用程序服務器調用我時,PowerShell停止。我應該在控制檯中看到輸出嗎?謝謝 – 2013-05-09 07:56:57

    +0

    @AhmedAtef - 根據您的意見更新。 – dugas 2013-05-09 20:21:44