C++ 64bit Dll 을 만들어서 C# 에서 사용하고 있었다...
그런데... 문제가 발생했다. 사용해야 할 PC가 Stick PC 로 바뀌면서 32bit로 변환해주어야 하는 상황이 발생한 것..
dll을 32bit로 컴파일해서 넣으면 끝나는 줄 알았다.
그렇게 쉬운게 아니었다. 에러는 계속 나고.. 해결은 안되고..
다른 에러들은 쉽게 해결했지만 마지막 에러가 오래 걸렸다.
추가 정보: PInvoke 함수 'H-Stage_Demo!H_Stage_Demo.MainForm::SetMagnification'에 대한 호출 결과 스택이 불안정하게 되었습니다. 관리되는 PInvoke 시그니처와 관리되지 않는 대상 시그니처가 일치하지 않기 때문인 것 같습니다. 호출 규칙 및 PInvoke 시그니처의 매개 변수와 관리되지 않는 대상 시그니처가 일치하는지 확인하십시오.
이런 에러인데.. Invoke라 길래 동기화인줄 알고 동기화 처리 하다가 에러를 그대로 구글에 입력하니까 해결방법이 나왔다.
출처 : http://freyya.tistory.com/131
설명이 잘되어 있는 곳이 있었지만.. 도통 무슨말인지 모르겠고 시간도 없기에 그냥 해결방법만 간단히 나온 출처를 남긴다.
이전에 정리 했듯이 C#에서 DLL 함수를 사용하기 위해서는 DllImport 를 해야 하는데
[DllImport("DLL파일명")]
함수();
이런 식이으로 하면 되었지만 위의 에러가 발생할 경우에는 호출방법을 정의해 주어야 한다.
해결
[DllImport("DLL파일명", CallingConvention = CallingConvention.Cdecl))]
함수();
간단한가... 그래도 왜 저렇게 써야하는지는 나도 이해가 안되므로 나중에 기회가 된다면 정리하자.
'ETC > C#' 카테고리의 다른 글
[C#] 2차원 배열 1차원 배열에 복사. (How to copy a row values from a 2D array into a 1D array?) (0) | 2018.03.26 |
---|---|
[C#] 다른 프로세스에 키보드 이벤트 발생 (0) | 2017.04.18 |
[C#] 비프(Beep)음 내기 (0) | 2017.02.21 |
[C#] 시리얼 포트 검색 (0) | 2017.02.10 |
[C#] 배열 0으로 초기화(Enumerable.Repeat) (0) | 2017.01.24 |