VB.Net의 다중 프로젝트 솔루션에서 전역 이벤트를 발생시키는 것이 가능합니까? 예를 들어 프로젝트 1에는 Form1이라는 양식이 있습니다. Form1에는 클릭하면 이벤트가 발생하고 project2는 해당 이벤트를 처리 할 수 있으며 심지어 project3도 해당 이벤트를 처리 할 수있는 버튼이 있습니다.VB.Net 다중 프로젝트 솔루션의 이벤트
답변
"글로벌 이벤트"를 유일한 목적으로하는 클래스가있는 전용 프로젝트를 가질 수 있습니다. 해당 클래스가 모든 프로젝트가 동일한 인스턴스에 액세스 할 수 있도록 싱글 톤 패턴을 구현하도록하십시오. 다른 모든 프로젝트는이 프로젝트를 참조 할 수 있으며 다음과 같이 수 : 여기
' This is in Project3
Public Class Class1
Private Sub New()
End Sub
Private Shared _Instance As Class1
Public Event GlobalEvent()
Public Shared ReadOnly Property Instance As Class1
Get
If IsNothing(_Instance) Then
_Instance = New Class1
End If
Return _Instance
End Get
End Property
Public Sub RingTheBell()
RaiseEvent GlobalEvent()
End Sub
End Class
는 견적입니다 Project1의에서, Project2에있는 FormB을 (Project1의이 Project2에와 프로젝트 3 모두에 참조가) 표시. 우리는 싱글 인스턴스를 잡고 "글로벌 이벤트"마련하기 위해 RingTheBell() 메소드를 호출
' This is in Project1
Public Class FormA
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
Dim frmB As New Project2.FormB
frmB.Show()
End Sub
Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
Project3.Class1.Instance.RingTheBell()
End Sub
End Class
마지막으로, 이상 Project2에, 우리는 또한 싱글 인스턴스를 잡고 그 GlobalEvent에 가입을 (를 Project2 만 참조가) 프로젝트 3에 : 그래서 "글로벌 이벤트"에 가입하고자하는 모든 프로젝트는 단순히 프로젝트 3에 대한 참조를 추가하고 프로젝트를 구독 할 수 있습니다 할 수있는 싱글 인스턴스를 반환하는 인스턴스() 메서드를 사용하여
' This is in Project2
Public Class FormB
Private WithEvents x As Project3.Class1 = Project3.Class1.Instance
Private Sub x_GlobalEvent() Handles x.GlobalEvent
MessageBox.Show("GlobalEvent() trapped in Project2")
End Sub
End Class
로 이벤트.
이것은 가능한 여러 경로를 통해 가능합니다. 이 경우 의존성 주입을 선호합니다.
먼저 글로벌 이벤트 소유자 프로젝트를 만듭니다. 나는 GlobalEventSample이라는 이름을 지었다. 기본 네임 스페이스를 제거하고 명시 적으로 코드 구조를보다 분명하게 선언했습니다.
Namespace GlobalEventSample
Public Module Module1
Public Event GlobalEvent As EventHandler
Public Sub Main()
Console.WriteLine("Press any key to raise event...")
Console.ReadKey(True)
RaiseEvent GlobalEvent(Nothing, EventArgs.Empty)
Console.WriteLine("Press any key to quit...")
Console.ReadKey(True)
End Sub
End Module
End Namespace
이제 소비자 프로젝트를 만듭니다. 나는 GlobalEngineConsumer라고 명명했다. 나는 기본 네임 스페이스를 제거하고 명시 적으로 (마찬가지로 위) 여기 선언 : 나는 "IGlobalEventOwner"라는 인터페이스를 선언 한
Namespace GlobalEventConsumer
Public Interface IGlobalEventOwner
Event GlobalEvent As EventHandler
End Interface
Public Class Class1
Public Sub New(ByVal globalEvent As IGlobalEventOwner)
AddHandler globalEvent.GlobalEvent, AddressOf GlobalEventHandler
End Sub
Public Shared Sub GlobalEventHandler(ByVal sender As Object, ByVal e As EventArgs)
Console.WriteLine("Event Handled!")
End Sub
End Class
End Namespace
공지 사항. 이벤트가있는 객체를 정의하는 것뿐입니다. 이 이벤트에는 처리하려는 전역 이벤트와 동일한 시그니처가 있습니다.
예제 프로젝트로 돌아가서 소비자 프로젝트에 대한 참조를 만듭니다.
소비자 프로젝트에는 IGlobalEventOwner를 구현하는 개체가 필요합니다. 모듈은 인터페이스를 구현할 수 없으므로 대신 모듈의 이벤트를 처리 한 다음 자체 이벤트를 실행하는 개인 클래스 인 GlobalEventRouter를 만듭니다. 마지막으로 Main 서브 클래스에 클래스 1의 새 인스턴스를 만들고 GlobalEventRouter 클래스의 인스턴스를 전달합니다.
Namespace GlobalEventSample
Public Module Module1
Public Event GlobalEvent As EventHandler
Public Sub Main()
Dim consumer As New GlobalEventConsumer.Class1(New GlobalEventRouter())
Console.WriteLine("Press any key to raise event...")
Console.ReadKey(True)
RaiseEvent GlobalEvent(Nothing, EventArgs.Empty)
Console.WriteLine("Press any key to quit...")
Console.ReadKey(True)
End Sub
Private Class GlobalEventRouter
Implements GlobalEventConsumer.IGlobalEventOwner
Public Event GlobalEvent(ByVal sender As Object, ByVal e As System.EventArgs) Implements GlobalEventConsumer.IGlobalEventOwner.GlobalEvent
Public Sub New()
AddHandler Module1.GlobalEvent, AddressOf GlobalEventHandler
End Sub
Private Sub GlobalEventHandler(ByVal sender As Object, ByVal e As EventArgs)
RaiseEvent GlobalEvent(sender, e)
End Sub
End Class
End Module
End Namespace
출력 :
아무 키나 눌러 이벤트 인상 ...
이벤트는 취급!
아무 키나 눌러 종료하십시오.
- 1. 다중 프로젝트 VS2005 솔루션의 IntelliSense
- 2. 다중 프로젝트 솔루션의 특정 프로젝트 분기
- 3. VB.NET 솔루션의 간접 참조
- 4. 1 솔루션의 VB.Net 및 C# 프로젝트
- 5. 다중 프로젝트 솔루션의 공통 구성 파일은 무엇입니까?
- 6. 솔루션의 프로젝트/어셈블리 나열
- 7. TypeScript : 솔루션의 여러 프로젝트
- 8. 솔루션의 프로젝트 간 PartialView 공유?
- 9. VB.NET 코드에서 VB.NET 이벤트 처리
- 10. DataGridView에 이벤트 만 VB.Net
- 11. VB.NET - 솔루션의 다른 프로젝트에서 네임 스페이스 가져 오기
- 12. 웹 사이트 솔루션의 하위 프로젝트 자동 컴파일
- 13. 동일한 솔루션의 프로젝트 간 링크 문제
- 14. Visual Studio 프로젝트 및 솔루션의 개념을 모르겠습니다.
- 15. 코드 플렉스에서 내 솔루션의 프로젝트 하나를 삭제하십시오.
- 16. TFS 및 여러 솔루션의 공유 프로젝트
- 17. fron 솔루션의 모든 프로젝트 가져 오기 오류
- 18. 디버그 모드에서 솔루션의 다른 프로젝트 시작
- 19. 솔루션의 msbuild 및 여러 웹 프로젝트
- 20. 여러 프로젝트 솔루션의 일반적인 키 누르기
- 21. Ruby 솔루션의 프로젝트 오일러 # 3 시간 종료
- 22. 프로젝트 투영 특정 참조 동일한 솔루션의 버전
- 23. vb.net .net 프로젝트 문제
- 24. 솔루션의 여러 프로젝트 대 소스 컨트롤의 여러 프로젝트 대
- 25. VB.NET MYSQL 다중 쿼리
- 26. 소켓 다중 연결 VB.NET
- 27. VB.NET 다중 언어 프로그램
- 28. vb.net C# 정적 이벤트?
- 29. Vb.net 프로세스 닫기 이벤트
- 30. 바코드 스캔시 VB.NET 이벤트
왜 다른 프로젝트에서 이벤트를 처리해야합니까? 당신은 Form1에서 이벤트를 처리 할 수 없으며 Form1이 project2, project3 등에서 필요한 코드를 호출하도록 할 수 있습니까? –
@Douglas prject1을 모두 참조해야하며 Visual Studio에서 순환 참조 오류가 발생하기 때문에 project1과 project2를 참조 할 수 없습니다. 이벤트를 일으키고 다른 프로젝트가 응답 할 수있게하려면 project1이 필요합니다. 그렇지 않으면 프로젝트간에 더 쉽게 상호 작용할 수 있기를 바랍니다. – TheRyan722
Eons 전에 .NET Remoting을 통해이 문제를 해결할 수있었습니다. 그렇지만이 방법을 사용하는 것이 좋지는 않을 것입니다. WCF 솔루션이 필요에 따라 여기에서 작동 할 수 있습니다. – gws2