Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从vb.net处理IronPython中抛出的事件_Python_Vb.net_Dll_Ironpython - Fatal编程技术网

从vb.net处理IronPython中抛出的事件

从vb.net处理IronPython中抛出的事件,python,vb.net,dll,ironpython,Python,Vb.net,Dll,Ironpython,我正在使用IronPython尝试连接到我的vb.net程序 我试图找到一些路径,让事件在两者之间传递(不确定这是否可能) 我所做的是创建一个公共的DLL,我的程序(vb.net)引用它以及IronPython脚本,然后在我的vb.net代码中执行python 在IronPython中,这可能吗?我找不到任何方法在它们之间传递类型为A的对象,或者让它们通过事件链接起来 处理异常的一般方法要求您的VB.net程序对IronPython程序具有引用/依赖关系。异常被抛出调用堆栈,直到它们被处理。您描

我正在使用
IronPython
尝试连接到我的vb.net程序

我试图找到一些路径,让事件在两者之间传递(不确定这是否可能)

我所做的是创建一个公共的
DLL
,我的程序(
vb.net
)引用它以及
IronPython
脚本,然后在我的
vb.net
代码中执行python


IronPython
中,这可能吗?我找不到任何方法在它们之间传递类型为A的对象,或者让它们通过事件链接起来

处理异常的一般方法要求您的VB.net程序对IronPython程序具有引用/依赖关系。异常被抛出调用堆栈,直到它们被处理。您描述的体系结构表明它们是对等的,彼此之间没有直接的依赖关系,因此在
Catch
块中处理这些异常不会正常工作

我能看到这一点的唯一方法(我的头顶)是,如果您可以通过将异常发送到公共DLL中的方法来处理IronPython中的异常,该方法将引发一个事件,该异常作为事件参数的一部分,就像您可以得到一个
未处理的异常
事件一样

AddHandler My.Application.UnhandledException, AddressOf Foo

这将允许您的VB代码响应IronPython应用程序中发生的事情。

IronPython
扩展使用
System.Reflection
。它会自动导入提供给它的类型和方法

可以在DLL类库中公开类型

构建DLL后,您可以在“IronPython”中导入它

import clr    
clr.AddReferenceToFileAndPath(r"C:\SomeFolder\SomeClassLibrary.dll")
您还可以动态加载DLL并导入命名空间:

sys.path.append(r"C:\SomeFolder")  
clr.AddReference ("SomeClassLibrary.dll") # Your Class libary
import SomeNamspace  # import SomeNamespace from your dll.
在库中公开事件:

Public Class SomeClass

    Public Event SomeEvent ....
然后,您可以在“IronPython”中使用它们

def SomeHandleHandler(*args):
    pass

Foo.SomeEvent += SomeHandleHandler
要使用
IronPython
执行相反的操作并触发事件,只需在Vb.Net代码中添加处理程序

以下是工作代码:

类库MyClassLibrary中的MyIpyClass.vb

Public Class MyIpyClass
    Public Event MyEvent()

    Public Sub New()
        AddHandler MyEvent, HandleMyEvent()
    End Sub

    Private Function HandleMyEvent() as MyEventEventHandler
        Console.WriteLine("Raised My Event")
        Return Nothing
    End Function


    Public Sub RaiseMyEvent()
        RaiseEvent MyEvent()
    End Sub

End Class
IronPython代码:

import clr
clr.AddReference("System.Windows.Forms")
clr.AddReference("System.Drawing")
clr.AddReferenceToFileAndPath("C:\\MyDllPath\\MyClassLibary.dll")
import MyClassLibary
from System.Windows.Forms import *
from System.Drawing import *


def mevent(*args): print("Event From IPY") # create IPython event hander for MyIpyClass.MyEvent

m = MyClassLibary.MyIpyClass() # create new instance of my class
m.MyEvent += mevent # Add IPythong Handler
m.RaiseMyEvent() # For Simplicity, Call MyIpyClass.MyEvent.RaiseEvent to raise the event



f = Form() # Create a Form to handle some events from System.Windows.Forms
f.Text = "My Form"

#defne a form click handler to print out the event args
def click(*args): print args
f.Click += click  

b = Button() # Create a button and add it to the form
b.Text = "GO"
b.Name = "GO"
b.Location = Point(10,10)

#create a button click handler that prints hellow word
def click(f, a):
    print("hello world")

#assign the button click handler
b.Click += click

#add the button to the form
f.Controls.Add(b)

#call Form.ShowDialog() - Show() blocks and will hang the form.
f.ShowDialog()

我一个人走了这么远。我不能做的是让python抛出事件并在我的VB.net代码中处理。对不起,我应该让你澄清你的问题是什么。如果你做到了这一点,那么唯一要做的就是像在VB中一样使用你的对象。我已经附上了完整的工作代码。我昨天发布活动后尝试了一下。我无法在.net代码中使事件触发一个。据我所知,事件需要属于一个对象,并且不能在python和.net中共享一个对象。你说不能共享对象是什么意思?当IronPython调用返回.net对象的方法时,IronPython现在将使用该对象的引用,就像它是在.net中创建的一样。