Powershell调用程序集委托

Powershell调用程序集委托,powershell,dll,delegates,Powershell,Dll,Delegates,我有一个用于进程控制应用程序的dll程序集,我在我的powershell脚本中使用load DLL包含我需要使用的委托类型,委托名称为: "X.Y.Delegate" 我在该DLL中有另一个方法,应以这种方式调用: Method( delegatetype CallbackMethod) 因此,我需要: 在我的脚本中定义类型为“X.Y.delegate”的委托,例如$MyDelegate 定义回调方法,以便在触发流程事件时调用它” 注意:如果我的问题看起来很傻,我很抱歉,我是一个绝对的初学者

我有一个用于进程控制应用程序的dll程序集,我在我的powershell脚本中使用load

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

"X.Y.Delegate"
我在该DLL中有另一个方法,应以这种方式调用:

Method( delegatetype CallbackMethod)
因此,我需要:

  • 在我的脚本中定义类型为
    “X.Y.delegate”
    的委托,例如
    $MyDelegate

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

  • 注意:如果我的问题看起来很傻,我很抱歉,我是一个绝对的初学者。

    更新:

    在仔细阅读您的评论和问题之后,我认为您可能希望利用异步事件处理。下面是一个侦听事件直到达到超时然后退出的示例。此示例假设您可以更改程序集以添加事件

    生成事件的类:

    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);
        }
       });
      }
     }
    }
    

    您的实际问题是什么?您是在问如何实现这些功能,还是想了解哪些选项更好?谢谢您的回答:)我实际上是在使用它来最大限度地减少资源消耗。与其每分钟检查10000个标记值,不如检查已更改的内容,我可以订阅eventhandler,创建自己的scriptblock将在事件发生时执行。这样,我就不会扫描我的10000个标记,每当发生变化时,我都会被回调。这是我对主题的理解,如果我错了,如果你纠正我,我将不胜感激。再次感谢。非常感谢,它确实有效。我认为这个想法是变量“ScriptBlock”“它封装了要执行的块。当我的应用程序开始回调脚本块时,Powershell停止响应,但我现在可以在我的应用程序服务器日志中看到处理程序启动,发送了一个处理程序对象,这意味着我的方向正确。您能否告诉我,在脚本执行后,powershell如何响应我的应用程序回调?当我的应用服务器回叫我powershell停止时,我在ISE上运行脚本debug。我应该在控制台中看到输出吗?Thanks@AhmedAtef-根据您的评论进行更新。
    # 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."