2010-05-27 2 views
4

Visual Studio 2008에서 잘 작동하는 응용 프로그램이 있으며 .NET 2010을 사용하기 위해 VS 2010에 가져 오려고합니다. 이상한 문제. 릴리스 모드 또는 디버거가 부착 된 디버그 모드 (F5)에서 코드를 실행할 때 프로그램 실행에 문제가 없습니다. 그러나 디버거 (Shift + F5)를 연결하지 않은 상태에서 릴리스 또는 디버그 프로그램을 실행하면 GDCM의 DLL에서 일부 코드를 실행하려고하면 액세스 위반 예외가 발생합니다. 나는 CMake와 Swig을 사용하여 지침을 따라 here VS 2010과 .NET 4를 위해 필요한 빌드를 조정했다.디버거없이 C# 응용 프로그램을 실행하는 경우에만 액세스 위반 예외가 표시됨

어떤 일이 일어나고 있는지 그리고 어떻게 해결할 수 있는지에 대한 아이디어가있다. 그것?

다음은 오류가 발생한 프로그램의 예입니다. 다시 말하지만, VS 2010에서 다음과 같은 프로그램을 사용하여 프로젝트를 만들면 디버거가 연결될 때 제대로 실행되고 디버거가 연결되지 않은 경우 실패합니다.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using gdcm; 

namespace GDCMVS2010Test 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      if (args.Length != 1) 
      { 
       Console.WriteLine("This program prints the patient name of a dicom file with gdcm"); 
       Console.WriteLine("Usage: [input.dcm]"); 
       return; 
      } 

      gdcm.Reader reader = new gdcm.Reader(); 
      reader.SetFileName(args[0]); 
      reader.Read(); 

      gdcm.File file = reader.GetFile(); 

      gdcm.StringFilter filter = new gdcm.StringFilter(); 
      filter.SetFile(file); 
      string value = filter.ToString(new gdcm.Tag(0x0010, 0x0010)); 

      Console.WriteLine("Patient Name: " + value); 
     } 
    } 
} 
+0

복제 코드를 게시 할 수 있습니까? 확인해야 할 첫 번째 사항은 잘못된 데이터와 p/Invoke 서명을 전달하는 것입니다. –

+0

dll에서 모든 방법에 액세스 할 때마다 나타납니다. 아주 간단한 예제 코드를 게시했습니다. – Jon

+0

적절한 gdcm dll과 함께 전체 VS 솔루션이 필요하기 때문에 복제를 허용하는 코드를 게시하는 방법을 모르겠습니다. – Jon

답변

1

사용중인 SWIG 버전이 올바르게 작동하지 않았기 때문입니다. 최신 버전의 SWIG가이 문제를 해결하기 위해 최근에 릴리스되었습니다 (버전 2.0). GDCM에서 CMake를 relan 한 다음 VS 2010으로 GDCM을 다시 작성하고 GDCM dll을 예제 코드에 다시 추가하면 모든 것이 잘됩니다.

0

프로젝트 속성을 확인하십시오. 내 대상 프레임 워크를 .NET Framework 4.0 클라이언트 프로필로 설정했을 때이 문제가 발생했습니다.이 때 클라이언트 프로필 하나가 있어야합니다. 혹은 그 반대로도.

+0

여러 개의 프로젝트가 있고 각 프로젝트는 .NET 4 Framework로 설정되었습니다. .NET 4 Client Profile에이 모든 설정을 시도했지만 여전히 문제가 발생합니다. 두 프레임 워크의 차이점은 무엇입니까? – Jon

+0

아아아, 나는 그 질문에 대답 할 수 없다 - 그것은 내가 더 탐험하는 의미였던 것이다. 그러나 나는 비슷한 행동을 만나고 "WTF ???"처럼되었습니다. 그리고 그들 모두를 하나 또는 다른 프로파일로 설정 한 결과, 액세스 위반 예외를 제외하고 모두 작동하도록했습니다. lol - 실수로 프로그래밍하는 고전적인 사례. –

관련 문제