2011-12-28 2 views
0

System.Runtime.InteropServices를 사용하여 C# 응용 프로그램에서 C++로 작성된 여러 함수를 호출합니다. 배열을 반환하는 특정 함수에 문제가 있습니다.C#에서 C++ DLL 래핑 문제

필자는 필자의 함수에서 아무 것도 반환하지 말아야하고 "반환 변수"에 대한 포인터가 엔트리 여야합니다. 하지만 제대로 관리하지 못합니다. 예컨대

I는 C++에서 함수 배열을 조작 X 및 Y 배열을 반환

void func(double *y, double *x){...} 

있는 경우.

내가하고 있어요 :

내 .H -in :

static class AnyClass 
    { 
    [DllImport(dllPath)] 
    public extern static void func(out double[] y, double[] x); 

    int otherfunc 
    { 
     double[] x = new double[5]; 
     double[] y = new double[5]; 

     ... 

     func(out y, x); 
    } 
    } 
: 내 C# 코드 -in

__declspec(dllexport) void func(double *y,double *x){...} 

: 내 cpp를 -in

extern "C" __declspec(dllexport) void func(double *y,double *x); 

하지만 System.EntryPointNotFoundException을 제공합니다.

단서가 있습니까?

+1

'func'과'function' 이름이 맞습니까? 왜냐하면 그들은 평등하게 보이지 않기 때문입니다 ... – Timbo

+1

첫 번째 코드 단편은 두 번째 매개 변수로 "x"를 가지고, 나중에있는 단락은 역순으로 나타납니다. 명확성을 위해 일관성있게 작성해야합니다. –

+1

그리고 함수는 크기가 5 인 배열에서만 작동합니까? 또는 크기 매개 변수가 필요합니까? – crashmstr

답변

3

EntryPointNotFoundException은 DLL에서 '함수'라는 것이 발견되지 않았 음을 의미합니다.

.h 파일에서 'func'이라고 부릅니다. 그러나 .cpp 파일에서 '함수'라고 부릅니다. 그리고 .h 파일이 extern "C"을 선언하는 유일한 장소이기 때문에 효과적으로 일어나고있는 것은 함수가 일반 c 스타일 대신 DLL C++ - style-name-mangled에 의해 내보내집니다. 그래서 C#이 일반 C 스타일의 '함수'를 찾으면 찾을 수 없습니다.

+0

묻는 중 오류가 발생했습니다. 둘 다 동일한 이름을 가짐 – Bruna

+0

.cpp 파일의 함수가 extern "C"인지 확인하십시오. –

+0

여전히 작동하지 않습니다. =/ – Bruna

1

.cpp 파일에 extern "C"을 입력해야한다고 생각합니다. 그렇지 않다면 두 개의 서로 다른 함수 func으로 끝날 수 있습니다. 올바른 연결은 선언되고 정의되지 않습니다.

참고 : Afairextern "C" 연결은 DLL 파일의 함수 이름 지정 방법도 지정합니다. C++ 함수의 경우 몇 가지 예가 있습니다. 서명과 관련된 이름 (예 : 매개 변수 및 반환 유형)에 후치가 추가됩니다. 이것은 C++에서 함수를 오버로드 할 수 있기 때문에 필요합니다. 따라서 extern "C"을 지정하지 않으면 함수의 이름이 DLL에서 다르게 지정되므로 관리되는 코드에서 함수를 찾을 수 없습니다.

1

EntryPointNotFoundException은 런타임에서 DLL에 지정된 함수 이름을 찾지 못했음을 의미합니다.

가능한 이유는 당신은 함수 당신의 DLL의 이름 또는 맹 글링 이름을 비활성화하지 않은 프로그램

  • 을 맞춤법이 틀린

    • 있습니다 (extern "C")

    첫 번째 이유는 쉽게 찾을 수 있습니다 , 모든 이름을 두 번 확인하고 실제로 동일한 지 확인하십시오.어떤 이유로 DLL을 변경할 수 없지만 C#과 다른 이름 인 경우 DllImportAttribute.EntryPoint 속성을 사용하여 다른 이름의 함수를 가리킬 수 있습니다.

    두 번째 것은 더보기가 어렵습니다. 문제를 진단하려면 Dependency Walker을 사용하여 실제로 컴파일 된 DLL 내부에서 무슨 일이 일어나는지 확인하는 것이 좋습니다. 이 도구를 사용하면 함수 이름을 볼 수 있으며 C++이 존재하는지 여부도 알 수 있습니다.

    이미 extern "C"을 사용하여 함수 이름이 이름 맹 글링으로 인해 영향을받지 않았는지 확인하려고했습니다. 컴파일러에서 extern "C"을 전혀 볼 수 없도록 .cpp 파일의 .h 파일을 포함하지 않았을 수 있습니다.