C 또는 C++에서 A 플러그인 시스템 구현
플러그인 스타일의 시스템을 구현하기 위한 팁은 무엇입니까?
C에서 (그리고 C++도 내가 직접 해보지는 않았지만) 이것은 가장 일반적으로 동적으로 로드된 모듈을 사용하여 수행됩니다.이러한 API:s는 플랫폼에 따라 다릅니다.
에서는 POSIX( )를dlopen()
함수족 기본적으로 로 빌드한 다음 플러그인을 한 다음할 수 .기본적으로 플러그인을 별도로 빌드한 다음 런타임에 로드하고 이름으로 기호를 검색한 다음 호출할 수 있습니다.
Win32 의는이 LoadLibrary()
코드를 DLL로 만드는 것과 매우 유사한 일을 합니다.
이 모든 것을 쉽고 투명하게 만드는 편리한 포장지는 GLib의 GModule API를 확인해보세요.
92/'93 타임 프레임에서 저는 C++로 코딩된 Aldus PageMaker의 플러그인 아키텍처를 작업했습니다.페이지메이커는 C++ OOP 프레임워크인 VAMP를 기반으로 개발되었으며, 이 프레임워크는 Mac OS와 Windows 간의 이동성을 지원합니다.
그래서 우리는 플러그인 아키텍처를 구축하기 위해 C++의 기능을 사용하려고 했습니다.이것은 소위 취성 베이스 클래스 문제로 인해 C++ 클래스에 매우 문제가 있음이 증명되었습니다.저는 저널에 발표되고 OOPSLA '93에서 성찰 워크숍에서 발표한 논문을 쓰기 시작했습니다.저는 또한 포틀랜드에서 열린 유제닉스 컨퍼런스에서 Bjarne Stroustrup과 접촉하여 몇 달 동안 대화를 나누었고, Bjarne Stroustrup은 저를 대신하여 취약한 베이스 클래스 문제를 다루는 것을 옹호했습니다. (아, 그 당시에는 다른 문제들이 더 중요하게 여겨졌습니다.)
마이크로소프트는 COM/DCOM 시스템과 이 문제에 대한 실행 가능한 해결책으로 여겨졌던 플랫폼을 위해 도입했습니다.C++는 COM 인터페이스를 정의하는 데 사용되는 추상 클래스를 통해 COM의 구현 언어로 사용될 수 있습니다.
그러나 요즘 개발자들은 COM/DCOM을 기피하고 있습니다.
이와 대조적으로, NeXT는 90년대 초 NeXT Step 프레임워크에서 Objective C를 사용하여 플러그인 아키텍처를 고안했습니다.애플의 컴퓨터와 아이폰과 같은 중요한 플랫폼의 맥 OS X에서 활기차게 살아가고 있는 오늘날의 모습.
플러그인 문제를 해결하는 Objective C를 우수한 방법으로 제출합니다.
저는 개인적으로 C++의 부서지기 쉬운 베이스 클래스 문제가 가장 치명적인 결함이라고 생각합니다.
만약 C 기반 언어 계열로 플러그인 아키텍처를 구축한다면, 목표 C를 사용할 것입니다.
제가 드릴 수 있는 최상의 플랫폼 및 언어 중립적 조언은 다음과 같습니다.
플러그인 SDK를 중심으로 전체 앱을 설계합니다.
IMO, 플러그인 SDK는 사후적으로 사용하면 안 됩니다.앱을 기본적으로 플러그인을 로드하는 빈 셸로 설계한 다음 핵심 기능을 자체 SDK에 구현하면 다음과 같은 이점을 얻을 수 있습니다.
- 구성 요소의 높은 모듈화와 명확한 목적 분리(이로 인해 아키텍처가 양호해질 수 밖에 없음)
- SDK를 매우 잘 사용하도록 강요합니다.
- 이를 통해 다른 타사 개발자도 매우 강력하고 핵심적인 기능을 만들 수 있습니다.
- 신규 개발자/채용자는 메인 앱을 터치할 필요 없이 주요 신규 기능에 대한 작업을 쉽게 시작할 수 있습니다. 플러그인으로 모든 작업을 수행할 수 있습니다. (다른 작업을 망치는 것을 방지합니다.)
C/C++에서는 동적 링크 라이브러리와 함수 포인터(C) 또는 인터페이스(C++의 경우 순수 가상 메서드로만 구성된 클래스)를 사용할 수 있습니다.하지만 자바스크립트를 사용하더라도 위의 아키텍처를 추천합니다.
Qt는 QPluginLoader: http://qt-project.org/doc/qt-4.8/qpluginloader.html 를 제공합니다.
보다 세분화된 제어가 필요하거나 want 필요한 경우 Qt는 QLibrary(http://qt-project.org/doc/qt-4.8/qlibrary.html 를 통해 라이브러리를 즉시 로드할 수 있는 수단도 제공합니다.
더 좋은 점은 플랫폼 간에 이동이 가능하다는 점입니다.
이것은 당신이 찾고 있는 것이 아닐 수도 있지만, Lua와 같은 스크립트 언어를 당신의 애플리케이션에 내장할 수도 있습니다.Lua는 다른 프로그램에 내장되도록 설계되었으며 플러그인 작성을 위한 스크립트 언어로 사용되었습니다.당신의 프로그램에 Lua 통역사를 추가하는 것이 꽤 쉽다고 생각합니다. 저는 Lua를 잘 모르기 때문에 이것이 얼마나 효과적인 해결책이 될지 장담할 수 없습니다.Lua에 대한 경험이 더 많은 다른 사람들은 Lua를 다른 어플리케이션에 내장시킨 경험에 대한 의견을 추가해주시기 바랍니다.
물론 이것은 당신의 플러그인이 루아로 쓰여져야 한다는 것을 의미합니다.Lua가 마음에 들지 않으면 사실상의 표준 Perl, Python, Ruby 인터프리터가 모두 C로 작성되어 C 프로그램에 내장될 수 있습니다.저는 이러한 언어를 스크립트 언어 확장으로 사용하는 많은 프로그램을 알고 있습니다.
하지만 질문이 좀 애매해서 무엇을 찾으시는지 모르겠습니다.아마도 사용자들이 플러그인으로 무엇을 할 수 있기를 바라는지에 대한 더 많은 정보가 적절할 것입니다.일부 작업의 경우 완전한 스크립팅 언어가 약간 오버킬일 수 있습니다.
Dynamic Linking Libraries를 이용하여 플러그인 시스템을 구현하는 방법에 대한 글을 작성하였습니다.기사는 Windows 프로그래머의 관점에서 작성되지만 이 기법은 Linux/Unix 유형의 환경에 적용될 수 있습니다.
기사는 여기서 찾을 수 있습니다: http://3dgep.com/ ?p=1759.
요점은 주 응용 프로그램(코어 응용 프로그램)과 플러그인 구현에 의해 암묵적으로 연결되는 "공통" DLL을 만들어야 한다는 것입니다.그런 다음 플러그인을 명시적으로 연결하고 코어 애플리케이션에 의해 런타임에 동적으로 로드할 수 있습니다.
또한 이 문서에서는 "공통" DLL을 사용하여 여러 DLL에 걸쳐 클래스의 정적(싱글톤) 인스턴스를 안전하게 공유할 수 있는 방법을 보여 줍니다.
또한 이 문서에서는 DLL에서 "C" 함수 또는 변수를 내보내고 런타임에 응용 프로그램에서 내보낸 함수를 사용할 수 있는 방법을 보여 줍니다.
플랫폼별 코딩으로부터 사용자를 보호하는 ACE(http://www.cs.wustl.edu/ ~schmidt/ACE.html)와 같은 프레임워크를 사용하는 것이 가장 좋습니다.
ACE에는 동적으로 조립된 응용프로그램을 만드는 데 사용할 수 있는 공유 라이브러리를 기반으로 하는 플러그인 프레임워크가 포함되어 있습니다.
더 높은 수준의 추상화를 위해서는 CIAO(http://www.cs.wustl.edu/ ~schmidt/CIAO.html)에서 CORBA 구성요소 모델의 오픈 소스 C++ 구현을 확인할 수 있습니다.
포코 클래스 로더를 보세요, 당신에게 흥미로울 수 있습니다.
dll 파일에서 C++ 클래스를 로드하는 플러그인 라이브러리 Pugg를 작성했으며 사용한 논리는 다음과 같습니다.
사용자는 고유한 이름을 가진 dll에서 함수를 내보냅니다.함수를 dll에서 로드하는 동안 인수를 사용하여 함수를 구별할 수 없으므로 이 이름은 충분히 고유해야 합니다.
C 함수는 "Driver"라고 불리는 하나 또는 여러 개의 공장 클래스를 등록합니다.모든 드라이버 클래스는 문자열과 연결됩니다.주 응용 프로그램이 클래스를 만들 때 관련된 문자열을 사용하여 관련 팩토리 클래스를 수집합니다.오래된 플러그인을 로드하지 않기 위해 버전 확인 시스템도 구현했습니다.
LoadLibraryA 및 GetProcAddress 기능을 사용하여 Dll 로드를 수행합니다(Pugg는 현재 윈도우에서 작동함).
한 가지 언급할 가치가 있는 것은 메인 애플리케이션과 dll은 동일한 컴파일러를 사용하고 동일한 컴파일 옵션(릴리스/디버그 모드, 최적화 설정, stl 버전 등)을 사용하여 컴파일되어야 한다는 것입니다.그렇지 않으면 클래스 매핑에 문제가 발생할 수 있습니다.
저는 상당히 순진한 시스템을 사용하여 약간의 성공을 거두었습니다.
- 플러그인용 API 규격 생성
- 단일 톤 플러그인 관리자 사용
- LoadLibrary/GetProcAddress 기반 런타임 동적 링크 사용
- 플러그인 알림 제어 기반 이벤트 처리 반전 구현
플러그인 아키텍처에 대한 이 팟캐스트도 흥미로울 것입니다.
언급URL : https://stackoverflow.com/questions/708527/implementing-a-plugin-system-in-c-or-c
'programing' 카테고리의 다른 글
깃 배시가 기본값으로 설정되어 있는데도 VSCode에서 전원 셸이 계속 열립니다. (0) | 2023.10.31 |
---|---|
실수를 했을 때 >> 프롬프트의 파워셸에서 어떻게 벗어날 수 있습니까? (0) | 2023.10.31 |
Get-ChildItem 결과에서 항목 목록을 제외하는 방법은 무엇입니까? (0) | 2023.10.31 |
*(긴*)0=0; 이 문장의 기능은 무엇입니까? (0) | 2023.10.31 |
신뢰할 수 없는(자체 서명된) HTTPS에 대한 AJAX 호출이 자동으로 실패함 (0) | 2023.10.31 |