이 글은 기계 번역의 미러 문서이며, 원본 기사로 바로 이동하려면 여기를 클릭해 주세요.

보기: 59779|회답: 9

[출처] .NET 플러그인용 "동적 대체"

[링크 복사]
2021-8-15 21:55:14에 게시됨 | | |
우리의 서비스 시스템이 일련의 기능적 서비스를 제공하고, 앞으로 더 많은 새로운 기능적 서비스가 추가될 것이며, 기능적 서비스가 변경되거나 제거되어야 할 수도 있다고 상상해 보세요. 이러한 서비스 시스템에 대한 일반적인 기본 요구사항 중 하나는 기능 서비스를 추가/제거/업데이트할 때 서비스 시스템의 작동을 중단할 수 없다는 것입니다. 보통 "핫스왑 플러그인"은 각 서비스를 플러그인 dll에 캡슐화하면 매우 쉽게 구현할 수 있지만, 플러그인의 "핫 대체"("동적 대체")는 문제가 됩니다. 그 이유는 플러그인 DLL을 서비스 시스템에서 삭제할 때, 서비스 시스템이 여전히 dll에 대한 근본 참조를 유지하고 있기 때문이며, DLL을 삭제하거나 덮어쓰려고 하면 윈도우가 "dll이 사용 중입니다"라는 메시지를 뜹니다.

그렇다면 이 문제를 어떻게 해결할 수 있을까요? 적어도 두 가지 선택지가 있다고 생각합니다:

(1) AppDomain 사용. 새로운 AppDomain에서 플러그인을 로드한 후 앱을 삭제하면 플러그인 dll이 서비스 시스템에서 깔끔하게 제거됩니다. 이 방식의 단점은 많은 AppDomain을 관리해야 한다는 점입니다(기능적 서비스가 너무 많기 때문에), AppDomains 간 통신이 원격 처리되어 시스템에 불필요한 골칫거리가 많이 생깁니다. 관심 있으시면 이 방법도 시도해 보시고, 저는 두 번째 방식을 선호합니다.

(2) 플러그인 Dll을 메모리에 복사한 다음, 그 DLL을 불러옵. 이렇게 하면 하드 드라이브의 DLL을 자유롭게 덮어쓰거나 삭제할 수 있습니다. 이전에는 하드 드라이브에서 플러그인 DLL을 직접 불러왔습니다. 이런 식으로요:

이제 우리는 전환점을 찾아야 합니다:


이로 인해 플러그인의 '동적 대체' 문제가 해결됩니다.





이전의:Spring Cloud는 모든 요청 인터페이스 로그를 MongoDB에 기록합니다
다음:.NET/C#은 밑줄을 그린 필드 이름으로 큰 호프 형태로 변환합니다
2021-8-15 23:11:28에 게시됨 |
이렇게 큰 프로젝트라서 밤에 서버를 재시작하는 게 낫지...
2021-8-17 14:43:41에 게시됨 |
공유해 주셔서 감사합니다!~'
2021-9-16 18:25:58에 게시됨 |
시험 응답
2021-9-17 21:39:18에 게시됨 |
배우세요
2021-9-18 19:05:29에 게시됨 |
이 글은 2021-9-18 19:07에 fyxh66에 의해 마지막으로 편집되었습니다.

System.BadImageFormatException:“未能加载文件或程序集“12505088 bytes loaded from 3.3hook, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”或它的某一个依赖项。试图加载格式不正确的程序。”IL 格式不正确。
  • var dll = Assembly.Load(addinStream);
86도 시도했지만, @小slag 사장님이 도와줄 시간이 있어요
 집주인| 2021-9-18 22:08:32에 게시됨 |
FYXH66이 2021-9-18 19:05에 게시됨
System.BadImageFormatException:“未能加载文件或程序集“12505088 bytes loaded from 3.3hook, Version=1 ...

이런 문제는 겪어본 적이 없습니다.

System.BadImageFormatException 예외가 발생하는 두 가지 상황이 있습니다: 프로그램의 대상 플랫폼이 일관성이 없> 참조 dll 파일의 시스템 플랫폼이 일관성이 없습니다.

확인: .NET 버전의 메인 프로그램과 플러그인 DLL이 일관되고, 대상 플랫폼도 일관되나요, 아니면 DLL이 .NET에서 개발되지 않나요?
2021-9-19 16:17:56에 게시됨 |
2021-9-18 22:08에 게시됨
이런 문제는 겪어본 적이 없습니다.

System.BadImageFormatException 예외가 발생하는 두 가지 상황이 있습니다: 프로그램 대상 플랫폼이 참조 dll> 일관성이 없습니다...

네, C++ dll...
 집주인| 2021-9-19 17:01:33에 게시됨 |

이건 분명히 좋지 않습니다. 동적 플러그인은 .NET DLL만 불러올 수 있고, C++를 호출하는 DLL은 이런 방식으로 조정되지 않습니다
2021-9-19 18:54:53에 게시됨 |
샤오자 2021-9-19 17:01에 게시됨
이건 확실히 좋지 않아요. 여기 동적 플러그인은 .net DLL만 불러올 수 있고, C++를 부르는 DLL은 이렇게 조정되어 있지 않아요...

Dll의 바이트[] 비트셋을 직접 사용해 C++에서 dll 메서드를 호출할 수 있는 방법이 있나요?
면책 조항:
Code Farmer Network에서 발행하는 모든 소프트웨어, 프로그래밍 자료 또는 기사는 학습 및 연구 목적으로만 사용됩니다; 위 내용은 상업적 또는 불법적인 목적으로 사용되지 않으며, 그렇지 않으면 모든 책임이 사용자에게 부담됩니다. 이 사이트의 정보는 인터넷에서 가져온 것이며, 저작권 분쟁은 이 사이트와는 관련이 없습니다. 위 내용은 다운로드 후 24시간 이내에 컴퓨터에서 완전히 삭제해야 합니다. 프로그램이 마음에 드신다면, 진짜 소프트웨어를 지원하고, 등록을 구매하며, 더 나은 진짜 서비스를 받아주세요. 침해가 있을 경우 이메일로 연락해 주시기 바랍니다.

Mail To:help@itsvse.com