P/Invoke를 사용하여 네이티브 C++ .dll에 대한 래퍼를 만들려고합니다.P/Invoke problem (불균형 스택)
// .h-file
CHROMAPRINT_API ChromaprintContext *chromaprint_new(int algorithm);
상기 방법의 구현 :
>// .cpp-file
struct ChromaprintContextPrivate {
int algorithm;
Fingerprinter *fingerprinter;
vector<int32_t> fingerprint;
};
:
// .cpp-file
ChromaprintContext *chromaprint_new(int algorithm)
{
ChromaprintContextPrivate *ctx = new ChromaprintContextPrivate();
ctx->algorithm = algorithm;
ctx->fingerprinter = new Fingerprinter(CreateFingerprinterConfiguration(algorithm));
return (ChromaprintContext *)ctx;
}
ChromaprintContextPrivate 타입은 구조
.DLL의 소스 코드는 지정된 다음 엔트리 포인트를 갖는다
C# 래퍼 코드 :
를 호출// .cs-file
[System.Runtime.InteropServices.DllImportAttribute(
"libchromaprint.dll",
EntryPoint = "chromaprint_new")]
private static extern System.IntPtr chromaprint_new(int algorithm);
public static IntPtr Chromaprint_New(ChromaprintAlgorithm algorithm)
{
// Hardcoded parameter for testing
return chromaprint_new(0); // (int)algorithm
}
은 다음과 MDA의 예외가 발생 :
PInvoke를 기능 'MyProject.ChromaprintWrapper!'MyProject.ChromaprintWrapper.LibChromaPrint :: chromaprint_new '에 대한 호출이 스택 불균형이있다. 관리되는 PInvoke 서명이 관리되지 않는 대상 서명과 일치하지 않기 때문일 수 있습니다. PInvoke 서명의 호출 규칙 및 매개 변수가 대상 관리되지 않는 시그니처와 일치하는지 확인하십시오.
그래서 문제가 무엇인지 이해합니다. 스택의 항목 수가 예상 한 것과 다릅니다. 메서드 매개 변수 int algorithm
이 괜찮다고 가정합니다. 비록 반환 형식에 대해 잘 모르겠습니다. 그것은 포인터가 아닌 구조체일까요?
위의 C# 코드는 .h- 파일을 P/Invoke Interop Assistant으로 실행하여 얻었습니다. 반환 형식이 잘못 되었습니까? 그것은 무엇이어야 하는가?
vector<int32_t> fingerprint;
의 C# 표현식은 무엇입니까?
(위 ChromaprintContextPrivate
구조를 참조하십시오.)