【问题标题】:Powershell Call Assembly DelegatePowershell 调用程序集委托
【发布时间】:2015-06-23 05:17:50
【问题描述】:

我有一个用于我们的过程控制应用程序的 dll 程序集,我在 powershell 脚本中使用它。

DLL 包含一个我需要使用的委托类型,委托名称是:

"X.Y.Delegate"

我在那个 DLL 中有另一个方法应该以这种方式调用:

Method( delegatetype CallbackMethod)

所以,我需要:

  1. 在我的 "X.Y.Delegate" 类型的脚本中定义一个委托,例如 $MyDelegate

  2. 定义一个回调方法,以便在触发流程事件时调用它”

注意:如果我的问题看起来很愚蠢,我很抱歉,我是绝对初学者。

【问题讨论】:

  • 您的实际问题是什么?您是在询问如何实施这些方案,还是想了解哪种方案更好?
  • 感谢您的回复 :) 我实际上是在使用它来最大程度地减少资源消耗。与其每分钟检查 10000 个标记值,不如检查已更改的内容,我可以订阅事件处理程序,创建自己的脚本块以在事件发生时执行。这样我就不会扫描我的 10000 个标签,只要有变化,我就会被召回。这是我对这个话题的理解,如果我错了,如果你纠正我,我将不胜感激。再次感谢。

标签: powershell dll delegates


【解决方案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."

【讨论】:

  • 非常感谢,它确实有效。我认为的想法是封装要执行的块的变量“ScriptBlock”。当我的应用程序开始回调脚本块时,Powershell 停止响应,但我现在可以在我的应用程序服务器日志中看到处理程序启动,发送处理程序对象,这意味着我的方向正确。你能告诉我脚本执行后powershell如何响应我的应用程序回调吗?我在 ISE 上运行脚本,调试,当我的应用程序服务器回叫我时 powershell 停止。我应该在控制台中看到输出吗?谢谢
  • @AhmedAtef - 根据您的 cmets 更新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-20
  • 1970-01-01
相关资源
最近更新 更多