2012-07-19 5 views
0

우리는 Visual Basic .NET에서 개발 된 매우 강력한 프로그램을 보유하고 있으며 전체 프로그램을 기본적으로 단일 개체로 나타내는 API를 만들었습니다. 이것은 꽤 잘 작동하며 수년간 사용해 왔습니다. 그러나 이제는 여러 인스턴스를 사용할 수있는 프로젝트가 생겼습니다.광범위하게 사용되는 프로젝트를 다중 인스턴스 화

문제는 코드베이스에 시작 모듈의 전역 변수 (gSvcMgr)에 대한 광범위한 참조가 있다는 것입니다. 이 객체 참조의 여러 인스턴스를 다른 변수로 만들려면 어떻게해야합니까? 네임 스페이스를 사용할 수 있습니까? 또는 Shadows 키워드?

내가 명확하지 않거나 세부 사항이 도움이 될 경우 구조를 더 자세히 설명 할 수 있습니다.

전역 옵션을 리팩토링하는 것이 유일한 옵션 인 경우 문제가되지 않지만 매우 큰 코드 기반과 소수의 개발자가 있습니다.

감사합니다.

+0

음 ... 해당 스레드에서 개체의 각 인스턴스를 만들고 모든 전역 변수를 [thread-static]으로 표시합니다. (http://msdn.microsoft.com/en-us/library/system.threadstaticattribute (v = vs.90) .aspx)? – GSerg

+0

왜 이것을 답으로 표시하지 않았는지 모르겠지만 제안에 감사드립니다. 이것이 Module 변수에서 작동하는지 알 수는 없지만 내일 사무실에 도착하면 시험해 보겠습니다. – FellowMD

+0

나는 이것이 완전히 작동하는지 확신 할 수 없기 때문에 답변을하지 않았다. – GSerg

답변

1

AppDomain.CreateInstanceAndUnWrap을 사용하여 응용 프로그램 개체의 각 인스턴스를 별도의 Application Domain에 만들 수 있습니다. 그러면 옵션의 각 인스턴스가 다른 도메인에 생성됩니다.이 도메인에는 공유 된 전역 데이터의 고유 한 복사본이 있고 서로를 만지지 않습니다.

그러나 앱 도메인을 사용하면 성능 비용이 발생합니다. 모든 메소드 호출은 앱 도메인간에 marshaled (읽기 복사 됨)이됩니다. 또한 응용 프로그램 객체를 MashalByRefObject에서 파생시켜야합니다.

비슷한 문제를 해결하기 위해 앱 도메인을 사용하는 예는 blog post을 참조하십시오.

+0

이것은 매우 유용 할 수 있습니다. 이 문제는이 단일 프로젝트에만 적용될 가능성이 높으므로 성능이 크게 떨어질 것이라고 생각하지 않습니다. 나는 GSerg의 퀵 픽스 (quick-fix)를 먼저하고, 문제가 생기면이 일이 나를 위해 무엇을 할 수 있는지 알아볼 것이다. 분명한 답변과 모든 참고를 보내 주셔서 감사합니다! – FellowMD

+0

리팩터링을 끝내기 시작했습니다. 이것은 아마도 내가 찾은 최선의 대안이므로, 포인터에 감사드립니다. 당신은 수표를 받는다 (유일한 대답이고, 좋은 제안이다) – FellowMD