2014-04-29 3 views
8

내 C# 응용 프로그램이 스레드로부터 안전하지 않은 네이티브 코드를 사용하고 있습니다.여러 AppDomains 및 네이티브 코드

프로세스 간 통신을 사용하여 동시성을 얻을 수있는 고유 코드의 여러 프로세스를 실행할 수 있습니다.

제 질문은, 대신 다른 App Domain에있는 관리되는 여러 스레드가 원시 코드를 호출하여 서로 간섭하지 않도록 App Domains를 사용할 수 있습니까?

주요 목표는 프로세스 분리를 ​​방지하는 것입니다.

답변

3

는 예는 할 수 있지만 노력이 효과로 상환되는 경우는 심각하게 측정해야한다.

DLL의 여러 복사본을로드하지 않으며 처리되지 않는 DLL이로드됩니다 (AppDomain 제외). 당신이 할 수있는 일은 같은 DLL의 복수 임시 복사을 만든 다음 LoadLibrary()으로로드하는 것입니다.

각 프로세스마다로드되지만 각 프로세스는 서로 분리되어 있으므로 스레드로부터 안전합니다. 이 모든 것들은 관리되지 않는 호출 (LoadLibrary, FreeLibrary, GetProcAddress 및 호출 자체)을 래핑하는 클래스 내에서 연결될 수 있습니다. 더 적은 리소스를 사용하고 여러 프로세스보다 빠르지 만 DllImport 사용을 줄여야합니다.

내가 볼 수있는 유일한 이점은 캐시를 유지하는 인스턴스를 재사용하는 경우 (객체 캐시보다 프로세스 캐시를 유지하는 것이 더 어렵다는) 여러 프로세스보다 훨씬 잘 확장된다는 것입니다.

9

아니요, AppDomains는 순수한 관리 코드 개념입니다. 관리 대상 루트를 별도로 유지함으로써 격리를 달성합니다. 한 AppDomain은 다른 개체를 볼 수 없으므로 코드를 중단하고 어셈블리를 언로드하는 것이 매우 안전합니다. 결코 사고가 나지 않으면 상태를 포함 할 수있는 모든 데이터가 삭제됩니다.

관리되지 않는 코드는 GC 힙과 AppDomains를 완전히 인식하지 않으므로 데이터 섹션과 자체 고유 힙 (HeapAlloc)에 할당됩니다. 이러한 할당은 프로세스 전역입니다. 따라서 프로세스를 격리 경계로 만들려면 DLL을로드하고 .NET 프로세스 상호 작용 메커니즘 (소켓, 명명 된 파이프, 메모리 매핑 파일, 원격 WCF) 중 하나를 사용하여 DLL을로드하는 도우미 프로세스가 필요합니다.

기술적으로 이름이 다른 DLL 복사본을 만들 수 있습니다. 그러나 그것은 매우 불규칙하게 늘어나고, [DllImport]를 더 이상 사용할 수 없기 때문에 pinvoke는 매우 어색합니다. 대리자 개체를 초기화하려면 각 내 보낸 함수 및 LoadLibrary() 및 GetProcAddress()에 대한 대리자 선언이 필요합니다.

+0

위대한 답변입니다. 정적 데이터가 충돌하지 않도록 동일한 기본 코드를 실행하는 다른 방법이 있습니까? (여러 프로세스 제외) – seldary