111,044
社区成员
比如我写一个DLL,我的DLL需要把数据传给上位机,于是我定义一个接口
但是我又需要上位机把一些数据传给我,于是我在接口里又定义一个事件。
现在的问题是,我的DLL里如果要获得接口里的事件,我是不是要实例化接口,然后在注册这个事件。。。
如果是这样,那我定义的这个接口岂不被二边实例化,首先是上位机要调用我DLL里的接口所以要实例化我的接口的。然后我要获得上位机引发的事件,那我也要实例化我自己定义的接口吗
是不是可以考虑消息机制。
事件只能在同一个电脑上使用, 关键是如何获取得上位机数据
如果可以在DLL上传数据之后立即得到上位机的数据,可以通过返回值得到.
如果DLL不上传数据,上位机也有数据要发,那就比较复杂了,
一是可以做成互为上位机和下位机
二是下拉机不断查询上位机是否有数据要发,通过返回值得到(注意查询频率)
三是建立长连接(最大难度不建议)
在C#中,当你在接口中定义事件时,通常不需要实例化接口本身,而是通过接口的实现类来实现和触发事件。你只需要确保上位机(客户端)通过接口的实现类来注册和处理事件。
假设你有一个接口 IMyInterface
,在其中定义了一个事件:
public interface IMyInterface
{
event EventHandler<MyEventArgs> MyEvent;
void SendData(string data);
}
你的DLL中需要实现这个接口。实现类需要提供事件的触发机制和接口方法的实现:
public class MyImplementation : IMyInterface
{
public event EventHandler<MyEventArgs> MyEvent;
public void SendData(string data)
{
// 处理接收到的数据
// 假设在处理数据后需要触发事件
OnMyEvent(new MyEventArgs(data));
}
protected virtual void OnMyEvent(MyEventArgs e)
{
MyEvent?.Invoke(this, e);
}
}
上位机(客户端)将使用你的接口实现类来注册事件处理程序并发送数据。你不需要在DLL中实例化接口,只需要实例化实现类:
class Program
{
static void Main()
{
IMyInterface myInterface = new MyImplementation();
// 注册事件处理程序
myInterface.MyEvent += MyInterface_MyEvent;
// 调用方法,模拟发送数据
myInterface.SendData("Hello from upper machine!");
}
private static void MyInterface_MyEvent(object sender, MyEventArgs e)
{
Console.WriteLine("Event received: " + e.Data);
}
}
通过这种方式,你不会在DLL中重复实例化接口,而是通过实现类来处理接口的功能和事件。上位机只需实例化实现类并注册事件处理程序。
此内容由Chat GPT 3.5提供:在接口中定义事件是一种常见的做法,但在C#中,接口是不能被实例化的,因为接口只定义了一组成员的契约,具体的实现需要在类中完成。所以在你的情况下,不需要实例化接口来注册事件。你可以在类中实现接口,并在类的构造函数中注册事件。当你需要处理上位机传过来的数据时,直接在事件处理方法中执行相应的逻辑。在你的DLL中,可以定义一个类实现接口并注册事件,然后将这个类的实例作为DLL的公共接口供上位机调用。这样既避免了接口被多次实例化的问题,也能实现你的需求。
至于你说啥上位机调用你如何?
我不知道你到底跟上位机是啥关系?
2个进程?一个进程?
1台机器?2台机器?
说白了就是,他跟他是不是同一台机器的同一个进程。先把这个弄清楚了,我们在回答
你先说你跟上位机用什么交互把。
用dll交互的?那就实例化一次。全局单例即可。
只能说到这里了。net目前被园子调教的太散了,都不在一个频道了。
你全局静态对象OK,双lock单例也行(这是园子派所谓的充血,贫血,所谓线程安全单例)
你直接用C# lazy 也可以,非园子派直接用这个把,又不是java卷王刷术语,一个lazy即单例又贫血还线程线程安全,搞那么多花头做甚
Lazy<T>
netcore(net4.62以上)lazy都可以省掉,直接Service.addsingleton<你的那个类> 就行,至于你说的接口事件么,你构造注入了,想在那个类订阅就在哪个类订阅