문제

무슨은"일반적인"방법 플러그인에서 컴파일한 언어(C#/C/C++/D)?저는 특별히 관심이 있는 언어에 관계없이 접근하지만 언어별하지 않지 않습니다.

간,"컴파일시"플러그인에서 접근 방법(다만 코드를 포함하거나지 않고 모든 것을 일)유효한 그러나 수 있는 것이 보다 동적인 접근 방식은 바람직하다.

에 대한 런타임의 형식,내가에 더 관심이 역학을 로드하는 플러그인과 이것 저것보다는 플러그인을 설계/응용 프로그램 인터페이스

편집:BTW 플러그인이 될 것이 노예이지 않고 있습니다.기본적인 조치의 플러그에는 것이는 주어진 상황에서,그것은 것에이라고"하는 것이"주어진 환경을 개체는 그것을 사용해야 한다는 것을 얻을 필요로 작동합니다.

도움이 되었습니까?

해결책

컴파일 된 언어 (컴파일 된 경우 프로그램이 어떤 종류의 가상 머신없이 기본 실행 파일로 실행되는 것을 의미하는 경우), 일종의 플랫폼 별 공유 라이브러리 접근 방식을 사용해야합니다. Windows에서 이것은 DLL을 사용하는 것을 의미합니다.

플러그인 인터페이스를 함수 세트 (특정 이름, 인수 및 전화 규칙) 측면에서 정의합니다. 그런 다음 공유 도서관 내에서 기능의 주소를로드하고 도시로갑니다. 창에서 이것은 사용을 의미합니다 getProcadDress (), 그런 다음 반환 값을 C의 적절한 유형의 함수 포인터 또는 사용중인 언어로 적절한 유형의 기능 포인터에 시전합니다.

더 바람직하지 않은 또 다른 옵션은 기본 애플리케이션 내에서 다른 언어에 대한 가상 머신을 실행하고 해당 언어에 대한 플러그인이되는 것입니다. 예를 들어, Cpython을 사용하여 Python VM을 실행하고 Python 모듈을 동적으로로드 할 수 있습니다.

다른 팁

모노 .addins .NET에 좋은 솔루션 인 것 같습니다. REPO에서 플러그인 (또는 Addins)을 다운로드 할 수 있도록 API가 포함되어 있다고 생각합니다.

플러그인의 어려운 부분은 다음과 같습니다. 찾기, 종속성 해결 및 버전 문제를 처리합니다. 이러한 문제를 처리하는 방법은 귀하와 플러그인의 저자에게 명확해야합니다. 이러한 문제가 잘못되면 통증이 끝나지 않습니다. 잘 작동하는 것에 대한 아이디어를 위해 플러그인을 사용하는 스크립팅 언어 및 응용 프로그램을 살펴 보겠습니다.

정적 생성자는 나쁜 의미에서 "영리한"것보다 더 종종 그렇지 않습니다. 어쨌든 플러그인을 한 번에 하나씩 (Dynamic Case에서)로드해야하므로 (동적 경우) 플러그인을 하나씩 플러그인을 하나씩 야하므로, 그렇게 할 때 마찬가지로 초기화 될 수 있습니다. 무엇보다도, 예상 API없이 플러그인을 거부 할 수있는 기회를 줄 수 있습니다.

플러그인에는 동적로드 라이브러리를 사용할 필요가 없습니다. 다른 메커니즘도 사용할 수 있습니다 : 공유 메모리, 소켓 등 ....

그것은 당신이 원하는 것에 달려 있습니다. EMACS와 GIMP에서 볼 수있는 일반적인 유닉스 패턴은 해석 된 구성 요소가 모든 작업을 수행하는 데 사용하는 필수 기능을 노출시키는 작은 컴파일 구성 요소로 구성된 프로그램을 작성하는 것입니다. 앱 위에 구축 할 수있는 새로운 기능을 제공하는 플러그 라인은 쉽지만 가능하기 위해 제공하는 기본 제품에서는 매우 유연해야합니다. 반대로 극단적으로 여러 형식으로 저장할 수있는 사진 편집기를 상상해보십시오. 사람들이 자신의 파일 형식 처리기를 작성하도록 허용합니다. 이를 위해서는 코드가 간단한 프리미티브 세트를 사용하여 런타임에 구현을 선택해야합니다. 직선 (UNIX) C에서 dlopen을 사용하고 C ++에서는 외부 C를 사용하여 수행 할 수있는 작업을 제한하고 dlopen을 제한하십시오. Objective-C에서는 당신을 위해 그것을 할 수있는 수업이 있습니다. 첫 번째 경우에는 통역사를 만들거나 재사용하여 원하는대로 무료 통치를 할 수 있습니다.

각 플러그인이 공통 함수 세트의 다른 구현을 캡슐화하는 슬레이브 타입 플러그인의 경우 호스트 응용 프로그램 (예 : "C : Program Files MyApp Plugins)에 알려진 플러그인 폴더에 DLL을 입금합니다. 그런 다음 반사를 통해 호스트에서 DLL을 호출하십시오.

~할 수 있었다 각 DLL이 설치 될 때 일종의 정교한 등록 프로세스를 수행하지만 간단한 플러그인 -10 폴더 접근 방식에 문제가 없었습니다.

편집 : C#에서이 작업을 수행하려면 DLL ( "플러그인")에 공개 클래스를 추가하고 필요한 기능을 구현합니다. 호스트에서 유형 플러그인의 객체를 만들고 메소드를 호출합니다 (모두 반사를 사용).

인터페이스와 무효 등록(EventSource)작동하는 것이 잘 보 ASP.NET ko IHttpModule.Init(HttpApplication)에 대한 예입니다.

이를 통해 응용 프로그램 작성자(who 컨트롤 EventSource)하여 이벤트를 추가로 필요 없을 확장하 IPlugin 인터페이스(필연적으로 선도하 IPluginEx,IPlugin2,IPlugin2Ex,etc.)

내가 사용한 접근법 (.NET) (.NET)는 호스트가 플러그인을 통해 플러그인을 시작하고 플러그인을 시작하고 플러그인이 저장 한 호스트에 대한 참조를 전달하도록하는 것입니다. 그런 다음 플러그인은 필요에 따라 호스트에서 메소드 (반사를 통해)를 호출합니다.

나는 대부분의 플러그인을 사용하면 일반적으로 다른 방향으로 통화가 이루어질 것이라고 생각합니다 (즉, 호스트는 필요에 따라 플러그인을 호출합니다). 필자의 경우 플러그인 자체에는 호스트 기능을 사용해야하는 UI 요소가있었습니다.

낮은 수준의 모듈 구현 문제 (예 : Windows DLL 및 구현 문제), 내가 사용하는 게임 엔진은 DLL에 전역 등록 기능이 있으며 플러그인 디렉토리의 모든 DLL에서 찾아 호출하려고 시도합니다. Registartion 함수는 기능을 노출시키는 데 필요한 부기를합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top