2010-05-12 4 views
3

일부 제 3 자 DLL에서이 이상한 문제가 있습니다. 타사 공급자는 특정 방법을 사용하려고 할 때마다 메모리 예외가있는 일부 오픈 소스 DLL을 참조합니다. 앱이 단일 핵심 시스템에서 실행될 때이 문제는 나타나지 않지만 분명히 사용자가이를 가정 할 수는 없습니다.앱에 단일 코어 만 실행하도록 강요 하시겠습니까?

강제로 응용 프로그램을 만들거나 더 나은 DLL을 단일 코어에서 실행하는 방법이 있습니까? 이 문제를 해결할 수있는 다른 방법은 없나요? 제 3 자에게 OS DLL을 재구성하게하는 것은 분명히 의문의 여지가 있습니다. (현재 나에게 약간의 아픈 부분이 있습니다 :)) 그래서이 기능을 직접 처리하거나이 기능을 제공하는 것을 잊어 버려야합니다.

그런데 OS DLL에서 던져지는 오류 메시지는 "손상되거나 보호 된 메모리에 액세스하려고합니다."입니다.

+0

당신이 찾고있는 마법의 단어는 '프로세서 친 화성'또는 '스레드 선호도'입니다. – mquander

+0

http://stackoverflow.com/questions/628057/how-to-set-processor-affinity-on-an-executable-in-windows-xp 도움이 될 수 있습니다 –

답변

4

Process.ProcessorAffinity을 사용하여 원하는 작업을 수행 할 수 있습니다. 이렇게하면 전체 응용 프로그램이 단일 코어로 실행됩니다.

편집 :이 문제는 DLL이 단일 프로세서 선호도를 갖기를 기대하는 결과 일 수 있지만 단일 스레드 만있을 때 발생하는 것은 거의없는 스레드 문제 (예 : 경쟁 조건) 일 수도 있습니다. 핵심. 마지막 항목이 사실이라면 손가락을 교차시키고기도하는 것 외에는 아무 것도 할 수 없습니다 (응용 프로그램이 안정적으로 유지되도록 기능을 떨어 뜨리는 것이 좋습니다).

+1

이것을 단일 스레드에 설정하려면 P/Invoke SetThreadAffinityMask http://msdn.microsoft.com/en-us/library/ms686247(VS.85).aspx. 그러나 이것은 .NET 스레드가 현재 사실이지만 항상 사실로 정의되지 않은 Win32 스레드에 엄격히 묶여 있다는 가정에 의존합니다. – Richard

+0

프로세서 선호도에 보안 문제가 있다는 점도 중요합니다. 코드에서 수행해야 할 일이 거의 없기 때문에 권한 문제를 해결할 수 밖에 없었습니다. 그러나이 중 하나가 바로 그 것입니다. – Toby

+0

솔직히 믿을 수는 없지만, 분명히이 문제가 수정되었습니다. 내가 100 %의 시간 동안 충돌을 일으킬 수있는 곳에서 나는 이제 0 %의 시간에 충돌을 일으킬 수 있습니다. 이것은 분명히 "안정적"인 것과는 거리가 멀지 만 출발점입니다. 그리고이 특별한 기능은 약간의 고객 만이 요청하고 있으며, 필요하다면 베타 버전으로 기꺼이 베타 버전으로 제공 할 예정입니다. 고맙습니다. – Kevin

1

개인적으로 나는이 기능을 삭제할 것입니다 (귀하는 이것이 옵션이라고 말했습니다). 멀티 스레딩은 매우 까다로운 주제이며 제 3 자 DLL이 잘 작성되지 않았다는 것이 명백합니다.

단일 코어에서 실행해도 문제가 표시되지 않는다고해서 문제가 발생하지 않는다고해서 문제가 발생하지 않는다는 의미는 아닙니다. 스레드 문제는 거의 발생하지 않습니다. 이따금 씩 제품이 고장날 수 있습니다.

+0

질문이 없습니다. – Blindy

0

32 비트 DLL을 참조 할 때 한 번 이상한 문제가 있었지만 .NET 응용 프로그램은 64 비트로 작성되었습니다. 당신이 단일 코어 머신에서는 발생하지 않는다고 언급했기 때문에, 나는 그들이 32 비트이고 멀티 코어 머신이 64 비트라고 가정하고있다.

당신이 언급하지 않은 BadImageFormatException을 얻는 유일한 차이점이 있습니다. 어쨌든, 내가 해결 한 방법은 내 응용 프로그램의 "플랫폼 대상"을 x86으로 설정하는 것이 었습니다.

관련 문제