2014-09-10 7 views
1

현재 저는 서로 결합하여 작동하는 복잡한 객체 시스템이 포함 된 .NET 취미 프로젝트를 진행하고 있습니다. 그러나 약간의 문제가 발생했습니다. .NET에서 메커니즘을 찾아서 런타임에 코드를 대체 할 수 없으며 이전에로드 된 이전 코드를 처리 할 수 ​​있습니다. 이는 모듈/객체를 동적으로 대체하고 사용자에게 변경 사항을 거의 즉시 표시하는 것을 의미합니다 (예 : 프로 시저를 다시 시작한 경우). 전체 프로그램은 다시 시작하지 않습니다..NET의 모듈 형 시스템 런타임에서 변경 가능

나는 각 세션에 대해 별도의 AppDomain을 가질 수 있고 필요한 어셈블리를로드 할 가능성을 이미 고려했습니다. 그러나 이것은 약간 비싸 보입니다. 또한 모든 세션에는 데이터베이스에 연결하는 것과 같은 공통 기본 어셈블리의 이점이 있으므로 이러한 클래스를 모든 단일 세션에로드한다는 의미입니다. 별도의 AppDomain에서 앞뒤로 데이터를 마샬링하면 데이터를 네트워크를 통해 클라이언트 응용 프로그램에 보낼 때 사용할 수있는 추가 오버 헤드가 발생하며이 코드는 세션을 관리하는 AppDomain 주 코드에 포함되어 있습니다.

코드의 특정 부분을 대체/언로드하는 프레임 워크 나 방법이 있습니까? 실제 응용 프로그램에서 어떻게 이루어 집니까? 해결 방법이있을 수 있습니까? 아니면 잘못된 도구 모음을 선택 했습니까?

답변

3

잘 정의 된 인터페이스가있는 일종의 플러그인 시스템이 필요합니다. 그런 다음 런타임 바이너리 (플러그인 * .dll)를로드하고 여기에서 객체를 만든 다음 그 위에 메소드를 실행합니다. 플러그인의 개체를 IPluginManager를 통해 만들어야하는 시스템을 만들 때 런타임에 코드를 바꾸는 데 아무런 문제가 없습니다.:)

또는

당신은 필요에 따라 (메모리) 컴파일합니다 * .cs 파일이있는 폴더와 같은 뭔가를 당신이 그 (것)들에서 사용하고 그들에 메서드를 호출 할 객체를 생성합니다. 기본적으로 런타임시 컴파일하지 않고 위와 같습니다.

거기에서 당신은 더 개선을 할 수 있습니다.

EDIT : AppDomain을 사용하지 않고 유일한 문제는 언로드 된 어셈블리를 언로드 할 수 없다는 것입니다. 그러나 그것은 정말로 문제가 아닙니다.

0

MEF을 살펴볼 수 있습니다. 그것은의 약자입니다 : Managed Extensibility Framework.
여기에 대한 다른 기사 MEF on codeproject입니다.

런타임시 dll을로드하여로드하는 데 사용됩니다. 이것은 일반적으로 plugins 또는 다른 어떤 폴더에 떨어 뜨려서 실행을 위해 사용되는 것입니다. 동적 현재 응용 프로그램 도메인 내에서 어셈블리를로드 할 수 있습니다 : 당신이 별도의 응용 프로그램 도메인을 필요가 있다고 생각하지 않습니다 Where can I learn about MEF?

+0

나는'MEF'를 옵션으로 생각했지만 직접'AppDomain' 관리를해야합니다. – ax1mx2

1

:

여기뿐만 아니라 좀 더 자습서에 대한 링크입니다. 그리고 각 어셈블리는 정의 된 인터페이스를 구현해야합니다 (사용법에 따라 다름). 예를 들어, FileSystemWatcher 클래스를 사용하여 필요에 따라 어셈블리를로드/언로드 할 수 있습니다.

그래, 네 말이 맞아, 단순히 언로드 어셈블리 (전용 응용 프로그램 도메인) 할 수 없습니다 http://msdn.microsoft.com/en-us/library/25y1ya39(v=vs.110).aspx

+2

AppDomain에서 어셈블리를 _unload_ 할 수는 없습니다. 그 이유는 당신이 (AppDomain 전체를 언로드 할 때) 아무 것도 언로 드하려는 경우 별도의 AppDomains가 필요하기 때문입니다. –

+0

네 말이 맞아. 하나의 어셈블리를 '언로드'하기 위해 전체 AppDomain을 언로드해야합니다. – DvS

0

참조하십시오. 하지만 ASP.Net vNext의 기능 중 하나는 단지 메모리 내 어셈블리가있는 기능이며 드라이브의 소스 코드를 변경하면 자동으로 컴파일되고로드된다는 것입니다. 따라서 메커니즘은 이전 버전을 언로드해야합니다.

저는 모든 도메인 간 통신을 피하기 위해 모든 어셈블리가 다시로드되는 AppDomain을 만드는 것으로 이러한 작업을 수행하고 있다고 생각합니다. 그러나 나는 정말로 모른다. 아마도 당신이 ASP.NET에서 이런 것들을 어떻게하는지에 대한 메커니즘을 더 파헤쳐 보면 좋은 해결책을 찾을 수있을 것이다. vNext의 최신 주제에 대한 자세한 정보는 Scotts Blog에서 찾을 수 있습니다.

0

글쎄, 나는 나를 위해 일하는 2 가지 해결책을 발견했다. 나는 그것을 공유하고 싶다. 첫 번째는 CollectibleAssembly을 사용하고 유형을 정의하는 것입니다. 이것은 확실히 조금 까다 롭습니다. 이러한 유형의 동적 어셈블리에는 많은 제한이 부과됩니다. 다른 옵션은 IronPython 또는 IronRuby과 같은 스크립팅 언어를 사용하는 것입니다. 새로운 Roslyn 컴파일러의 가장 큰 특징은 이전에 .NET 프레임 워크에서 사용할 수 없었던 스크립팅 API도 제공한다는 것입니다. 게다가 Roslyn 스크립팅 언어는 본격적인 등가물 (C# 또는 VB)과 매우 흡사합니다. 그리고 나는 또한 그 작은 능력을 가진 작은 example을 발견했습니다.