2009-05-09 1 views
0

관리되는/관리되지 않는 코드 interop을 사용하는 방법을 배우려하지만, 인터넷 검색이 4 시간 동안 수행되지 못했습니다. 극복. 저는 Visual Studio에서 2 개의 프로젝트를 작성했습니다. 하나는 win32 exe를 작성하고, 다른 하나는 windows forms .NET 어플리케이션을 작성하는 것입니다. 주변 mucking 무리 후 C++ 코드를 올바르게 호출하려면 C# 코드가 있지만 여기에서 내가 거기에있어 때마다 AccessViolationException 점점 시작했다. 응용 프로그램이 호출 형성하는 C#을 윈도우에서 코드 여기AccessViolationException 가장 기본적인 C++ 함수를 호출 할 때 관리 코드에서 생각할 수 있습니다.

 extern "C" __declspec(dllexport) void QuickTest() 
    { 
     int iTest = 0; 
     int aTestArray[3] = {1,2,3}; 
     return; 
    } 

그리고 :

 [DllImport("UnmanagedEvaluation2.exe")] 
     static extern void QuickTest(); 

매우 간단 바로 여기 .cpp 파일의 코드는? 호출이 작동하고 C++ 코드 (프로젝트의 관리되지 않는 디버깅이 켜져 있음)로 들어갈 수 있지만 AccessViolationException을 사용하여 매번 한 줄씩 작성하는 배열에서 종료됩니다. 실행 파일을 실행할 때 동일한 코드가 잘 실행됩니다 (C++ 코드는 콘솔 응용 프로그램 프로젝트에 있고 _tmain 함수 및 아무런 문제없이 호출 했음). .NET에서 호출 할 때마다 매번 불어납니다.

내가 여기에 실종되었다는 것이 명백해야하지만 자습서를 읽는 데 도움이되는 것이 없으며 그 예외에 관한 게시물 대부분은 복잡한 마샬링 또는 GCHandles에 문제가있는 사람들입니다. 모든 도움을 미리 감사드립니다.

업데이트 : 당신은 아래에 있었지만 이상했습니다. 처음에이 작업을 시작했을 때 나는 그것을 할 수 없다고 가정 했었습니다. (실행 파일에서 함수로 호출하십시오.)하지만 시도했을 때 실제로 작동했습니다. 그것은 당신이 실행 파일로 함수를 호출 할 수있는 것처럼 보이지만 메모리를 할당하려고 할 때 죽습니다. 어쨌든, 조언 주셔서 감사합니다, 지금 올바르게 작동하는 것 같습니다.

답변

2

실행 파일의 함수를 해당 실행 파일 외부에서 호출 할 수 없습니다. 코드를 DLL로 컴파일해야합니다.

+1

또는 일부 기호를 내 보내야한다는 것을 컴파일러에 알려줘야합니다. 나는 dll과 같은 수출 기호 앞에 exe를 만들었다. 거의 동일하지만 구성 및 컴파일러 관련 dllimport/export 지정자는 변경해야합니다. – Klaim

0

함수를 extern "C"으로 지정 했으므로 호출 규칙으로 cdecl을 사용합니다. 기본적으로 DllImport은 호출 규칙으로 StdCall을 사용합니다. 이것이 코드 충돌의 원인 일 수 있습니다.

[DllImport("UnmanagedEvaluation2.exe", CallingConvention=CallingConvention.Cdecl)] 
    static extern void QuickTest(); 

더 많은 정보를 원하시면 http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.callingconvention.aspx를 참조

으로 .NET 코드로 기능을 가져보십시오.