2011-02-26 3 views
5

나는 이것을 설명하는 가장 좋은 방법이 확실치 않으므로 이해하지 못한다면 의견을 남겨주세요.(.NET) DLL이로드 된 경우에만 함수를 수행하는 가장 좋은 방법은 무엇입니까?

기본적으로 나는 다양한 프로그램을 사용하는 다양한 작업을위한 몇 가지 라이브러리가 있습니다. 알림은 하나의 예일뿐입니다.

이제 새로운 프로그램을 만들고 있으며 가능한 한 가볍게하고 싶습니다. 내 알림 엔진을 포함하고 싶지만 실제로 많은 사람들이 기능을 사용한다고 생각하지 않으므로 선택적 다운로드와 마찬가지로 기본적으로 포함시키지 않을 것입니다.

어떻게 프로그래밍하나요?

관리되지 않는 Dll과 P/Invoke의 경우 기본적으로 try/catch 루프에서 전체를 포괄 할 수 있지만 관리되는 버전에 대해서는 확신 할 수 없습니다.

지금까지 내가 생각할 수있는 가장 좋은 방법은 DLL 파일이 시작시 존재하는지 확인한 다음 bool 또는 이와 유사한 필드를 설정하고 알림이 해고 될 때마다 if/bool 및 fire를 확인하십시오 ...

디버그 창에서 DLL 파일이 필요할 때만로드된다는 것을 보았습니다. 이 프로그램은 모든 구성 요소가 프로젝트에 표시 될 때 컴파일되지만 DLL이 없으면 최종 사용자 시스템에서 실행됩니까?

더 중요한 것은, 이것을하는 더 좋은 방법이 있습니까?

내 응용 프로그램에서 알림에 대해 아무 것도 갖고 싶지 않고 DLL 파일을 다운로드하면 외부에서이 기능을 추가 할 수 있습니다. notification("blabla"); (또는 비슷한)을 호출하는 것은 몇 가지 추가 바이트를 갖는 것이 세상 끝이 아니지만, 훨씬 더 큰 의도가 있고 이런 종류의 일에 대한 베스트 프랙티스를 알고 싶을 때 훨씬 더 아래로 생각하고 있습니다. .

답변

2

System.Reflection.Assembly와 해당 LoadFile 메서드를 사용하여 동적으로 DLL을로드 할 수 있습니다. 그런 다음 Assembly에있는 메서드를 사용하여 DLL에 포함 된 클래스, 유형 등을 가져 와서 호출 할 수 있습니다.

.dll이 있는지 확인하거나 플러그인 디렉토리에 모든 .dll을로드하면 원하는 것을 얻을 수 있습니다.

+0

미묘한 차이가 있지만 경로를 알지 못해도로드가 성공하는지 테스트 할 수 있습니다. 어셈블리 바인딩 구성은 예를 들어, 이름 확인이 작동하는 방법을 알 필요가없는 프로그램없이 플러그인 디렉토리의 위치. 즉, 코드는 실제 실제 어셈블리 파일에 대해 불가지론해야합니다. – harpo

+0

System.Reflection.Assembly를 살펴 보겠습니다. 감사합니다. ... ... 이미 투표를했고 투표를 못하게하겠다고 답한 답장에 공백을 편집했습니다. 관련이 있다고 생각합니다. 더 일찍. – Wil

1

dll이 이미 존재하지 않고 사용자 컴퓨터에서 프로그램이 실행되는지 여부에 대한 질문이 있습니다. 예, 프로그램이 실행됩니다. 당신이 dll에 정의 된 클래스를로드하기 위해 런타임을 필요로하는 어떤 일을하지 않는 한, dll이 컴퓨터에서 누락 되어도 상관 없습니다. 요청에 따라 dll을로드하는 것과 관련하여 원하는 부분에 대해서는 구성 및 리플렉션 (직접 또는 일부 IoC 전략에 따라)을 사용하는 것이 좋습니다.

0

시작할 때 플러그인을로드 해보십시오.

장소 전체에서 부울을 검사하는 대신 알림을위한 위임 필드를 만들고 no-op 함수로 초기화 할 수 있습니다. 플러그인로드가 성공하면 플러그인 구현에 델리 게이트를 할당하십시오. 그런 다음 이벤트가 발생하는 모든 곳에서 플러그인이 사용 가능할 수도 있고 사용 가능하지 않을 수도 있다는 사실을 염려하지 않고 델리게이트를 호출 할 수 있습니다.

4

내가 오히려 기본 하여 포함되지 것, 많은 사람들이 실제로 그 기능을 사용하는 것이 생각, 그래서하지 않습니다 - 단지 선택 다운로드로.

이러한 것들은 일반적으로 플러그인 (또는 추가 기능 또는 확장 프로그램)으로 설명됩니다.

.NET 4 이후로 표준 방법은 Managed Exensibility Framework입니다. 이것은 프레임 워크에 System.ComponentModel.Composition 어셈블리 및 네임 스페이스로 포함됩니다. 시작하려면 MSDN articleMEF programming guide을 읽는 것이 가장 좋습니다.

+0

저는 최근에 (최근 2 달) 심각한 C# 개발에 참여했습니다. 사용자 그룹에서 MEF에 대한 이야기가있었습니다. 저는 ... 그저 심각한 프로그래밍을하고 있었으면 좋겠어요. 머리 - 나는 그것이 무엇에 관한 것인지 전혀 몰랐다 ... 질문을 쓴 후에, 나는 갑자기 내가 원하는 방식으로 작동하는 중개자 유형 확장을 작성하는 방법에 대한 생각을 가지고 있었다. 그러나 나는 확실히 취할 것이다. MEF에서 내가 먼저해야 할 일을하는지 봅니다 (복잡하지 않다면 ... 저는 아직 완전히 새로운 것입니다!) – Wil

관련 문제