2012-05-10 3 views
0

내 ASP.NET 웹 페이지에 C++ .NET DLL에서 제공하는 일부 데이터가 필요합니다. 이 DLL을로드하고 처음에 함수를 호출하는 것까지는 모든 것이 잘 작동하는 것처럼 보였지만 현재는 내 프로젝트가 .cs 파일의 DLL을 참조하면 실제로 디버깅하지 않는 상태가 된 것 같습니다.C++ DLL을 참조 할 때 ASP.NET이 디버깅하지 않습니다. 중단 점이 적중되지 않습니다.

DLL을 참조하고 프로젝트에서 참조를 제거한 코드를 모두 주석 처리했으며 정상적으로 작동했습니다. 내가 다시 DLL에 대한 참조를 추가하고, 잘 작동했습니다. DLL의 네임 스페이스 (이 경우에는 MDnlnkCmdReader 사용)에 대한 using 문만 주석 처리하고 DLL을 참조하는 실제 코드는 남기지 않고 디버그를 눌렀을 때 중단 점에 아무런 영향을 미치지 않습니다. 그 줄을 다시 주석 처리하고 중단 점이 다시 나타납니다.

웹 페이지가 올바르게로드되지만 중단 점에 도달하지 않은 상태가되면 소스 코드로 다시 전환하여 중단 점을 보면주의 플래그가있는 개요로 표시됩니다. 나는 그들을 mouseover, 그때 그것은 "breakpoint는 현재 치지 않을 것이고 소스 코드는 원래 버전과 다르다"라고 말합니다.

나는 그 오류 메시지를 찾아 보았고 일반적인 해결책을 시도했습니다. 전체/bin 폴더를 핵으로 만들면 global.asax에 대한 웹 서버 오류 메시지가 표시되기 시작합니다. 이는 내가 어떤 CPU 모드 (일반적으로 x64로 빌드)에 빌드 될 때까지 지속되며,이 시점에서 x64에 빌드 된 DLL에 관한 메시지를 "로드 할 수 없습니다"라는 메시지가 나타납니다. 그것에 대한 참조를 삭제하면 페이지가 다시 작동합니다. x64 모드로 다시 전환하여 참조를 다시 추가하면 바로 시작한 지점으로 돌아갑니다. 재부팅도 도움이되지 않는 것 같습니다.

여기에 무슨 일이 일어나고 있는지, 그리고 어떻게 빠져 나올 수 있는지 아이디어가 있으십니까?

+0

디버거를 연결할 때 대상 코드 유형이 바뀌고 있습니까? – Tejs

답변

2

좋아, 지금 생각해 보니. 내가 다루고있는 것은 실제로 두 가지 다른 문제입니다.

첫 번째 문제는 ASP.NET 개발 서버가 프로젝트의 /bin 폴더에서 해당 DLL을 가져올 것만 같습니다. 임의의 CPU으로 설정하면 프로젝트가 빌드되지만, x86 또는 x64으로 설정된 경우 기본 설정은 bin/x86/Debug 또는 bin/x64/Debug입니다. 기본 빌드 위치가 x86 또는 x64으로 설정된 경우 개발 서버는 여전히 /bin 폴더의 루트에서 DLL을 가져 오려고 시도합니다.

마지막으로 작업 한 후에 Any CPU으로 프로젝트를 빌드 한 적이 없거나 /bin 폴더를 지우지 않았다면 DLL을 전혀 찾지 못하고 개발 서버에 "Could 'WebDownlink.Global'유형을로드하지 않습니다.(WebDownlink 프로젝트의 네임 스페이스입니다) "당신의 Global.asax 파일에 대한. 이것은 그것이 당신의 DLL을 찾을 수 없기 때문에 그것은 단지 /bin 폴더의 루트에 찾고 있기 때문이다 네임 스페이스를로드 할 수 없음을 의미합니다.

프로젝트를 Any CPU으로 빌드 한 다음 x86 또는 x64으로 빌드하려면 새 빌드가 적절한 하위 디렉터리에 있지만 개발 서버는 마지막으로 Any CPU 빌드의 파일을 가져옵니다 .Visual Studio 디버거는 빌드 한 파일을 사용 중이므로 마지막 Any CPU 빌드 이후 아무 것도 변경하지 않으면 다른 소스 코드 오류가 발생하고 디버깅이 제대로 작동하지 않습니다. 디버깅은 효과가 있지만 개발 서버는 여전히 Any CPU 버전을 실행하게되므로 비트 쓰는 것이 중요 할 경우 아무 것도하지 않으려 고하면 혼란 스러울 수 있습니다.

올바른 해결 방법은 x86 모드를 /bin/x86/Debug 폴더가 아닌 /bin 폴더의 루트에 빌드하도록 구성하는 것 같습니다. 아니면 처음에는 관리되지 않는 DLL을 참조하지 마십시오.

이는 ASP.NET 개발 서버가 32 비트 모드에서만 실행되는 반면 64 비트 시스템에서는 IIS 응용 프로그램 풀이 64 비트 모드로만 실행된다는 두 번째 문제에 직면 해 있습니다 (알고있는 경우 이 중 하나를 변경하는 방법 중, 알려 주시기 바랍니다). Any CPU으로 빌드 할 수없는 관리되지 않는 DLL에 코드를 연결해야하는 경우이를 고려해야합니다. 그것이 위의 x86을 참조하는 이유입니다. x64의 빌드 위치를 변경하는 데 개발 서버가 실행하지 않기 때문에 아무런 변화가 없습니다.

다행히도, 나는 내 코드가 참조하는 DLL에 대한 소스를 가지고 있으며, 다른 것을 참조하지 않으므로 개발 서버 모두에서 32 비트 및 64 비트 모드로 쉽게 빌드 할 수있다. 전체 IIS. 다시 작성할 수없는 32 비트 DLL을 참조하는 경우 32 비트 컴퓨터에 배포하거나 IIS 응용 프로그램 풀이 32 비트에서 실행되도록하는 방법을 찾아야합니다. 티. DLL이 64 비트이고 다시 빌드 할 수없는 경우 전체 IIS에서 관련된 모든 디버깅 코드를 수행하면됩니다.

내 솔루션은 DLL을 32 비트로 빌드하고 참조를 재설정 한 다음 출력 경로를 /bin으로 설정하여 32 비트 모드로 빌드하는 것입니다. 배포 할 때 DLL을 64 비트로 다시 빌드하고 참조를 다시 설정하고 64 비트로 프로젝트를 빌드 한 다음 IIS에 배포합니다.

0

디버깅하는 동안 "모듈"창을 열고 "경로"열을 살펴보십시오 - 어셈블리 경로가 이 소스 코드와 일치하는 어셈블리와 일치합니까?

ASP.NET은 일반적으로 "Temporary ASP.NET Files"폴더에 어셈블리 복사본을 저장하므로이 파일도 지워야 할 수도 있습니다.

소스 코드가 이 아닌 한 디버그 할 수있는 "원본 파일과 정확히 일치하도록 원본 파일 필요"를 해제 할 수도 있습니다. 즉,이 멀리 있습니다. 그러나 기본 문제 (어셈블리가 소스와 일치하지 않음)를 수정하는 것이 좋습니다.

+0

모듈 경로에있는 파일의 타임 스탬프는 일종의 홀수입니다. dev 서버에서 모듈 경로는 항상 Windows 디렉터리 아래의 폴더입니다. 이 폴더의 dll에 대한 수정 날짜는 항상 프로젝트 디버그 폴더의 dll과 일치하지만 .pdb 파일에는 항상 이전 타임 스탬프가 있습니다. 이것은 라인 주석/중단 점 적중과 라인 주석 해제/중단 점 모두에서 동일한 조건으로 충돌하지 않습니다. – Mason

관련 문제