2013-01-05 1 views
0

내 C++ DLL에 다음과 같은 메서드가 있는데 p/invoke를 통해 내 C# 응용 프로그램에서이 함수를 호출하려고합니다. 나는 C#에서 사용DllImport에 의해 C#에서 C++ 메서드 호출

void Graphics::Create(char* Project, char* Connection, int Count, char *_Source[], char *_Destination[], char *_Search[], char *_Replace[], int _Block[]) 

서명은 다음과 같습니다

[DllImport("Wincc.dll", CharSet = CharSet.Unicode, SetLastError = true)] 
static public extern void Create(IntPtr Project, IntPtr Connection, int Count, [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPStr)] string[] _Source, [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPStr)] string[] _Destination, [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPStr)] string[] _Search, [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPStr)] string[] _Replace, [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.I4)] int[] _Block); 

나는 C#에서 알 수없는 방법으로 구매하십시오. 내 서명이 틀린 것 같아. 그러나 나는 틀린 것을 알아낼 수 없다.

답변

1

만듭니다. 이를 수행하려면 함수 앞에 extern "C"을 추가하십시오.

extern "C" { 
    int foo(); 
} 

하지만 늘 C++ 방법에서 작동합니다. 그래도 uglier solution이 있습니다. 그러나 나는 그것을 추천하지 않는다.

최상의 방법은 래퍼를 적어 두는 것입니다. C++에서 함수를 사용하여 태스크 (필요한 것만)를 래핑하십시오. 함수에서 이러한 메소드를 호출 할 수 있습니다. 그런 다음 C 링키지로 컴파일하십시오. 그러면 C#에서 호출 할 수 있습니다.

0

DLL을 종속성 워커로 검사하여 DLL에 적절한 내보내기가 있는지 확인하십시오. YOURDLLNAME.DEF 파일에서 내보내기 정의를 시도하십시오. 이처럼 :

YOURLLNAME.DEF

수출 는 C++은 C의 결합을하지 않는 한 당신은 C++ 기능를 호출 할 수 없습니다