2017-03-20 10 views
1

나는 많이 봤지만 내 매우 구체적인 문제에 대한 해결책을 찾지 못했습니다. 적어도 매우 구체적인 것으로 보입니다. 다음과 같은 상황이 있습니다 :Mono/C# 프로그램으로 linux/C++ 함수를 호출하는 방법은 무엇입니까?

ARM- 보드에 임베디드 리눅스 (데비안). CAN 버스 및 SocketCAN API를 통해 데이터를 보내고받는 "오래된"C++ 응용 프로그램이 있습니다.

하지만 최근에 저는 C#으로 몇 가지 프로젝트를 진행했으며 .NET Framework가 정말 마음에 들었습니다. 이것이 내가 임베디드 시스템에 Mono를 설치 한 이유입니다. 순수 C# 응용 프로그램을 실행해도 아무런 문제가 없습니다.

하지만 이제 mono/C# 응용 프로그램을 통해 CAN 버스에 액세스하려고합니다. 소켓 API로 API가 없으므로 문제가되는 것 같습니다. 그래서 C# 프로그램이 데이터를 처리하는 동안 기본 소켓 작업을 생성하고 처리하는 C++ 함수를 호출하는 아이디어가 있습니다.

C++ 함수를 호출하거나 C++ 함수/클래스를 DLL로 컴파일하고 C#에서 호출하는 것과 같은 것들을 발견했습니다. 문제는, 내 호스트 윈도우 머신의 Visual Studio Compiler가 리눅스 커널 유틸리티를 알 수 없기 때문에 DLL에 SocketCAN/C++ 프로그램을 컴파일하는 방법을 찾지 못했다는 것입니다.

누군가이 아이디어를 어떻게 해결할 수 있을지 알고 있습니까? 나는 이것에 대한 더 많은 해결책이 있음을 알 수 있지만, 나는 그것을 알 수 없다.

+3

dll로 컴파일 할 필요가 없습니다. 정기적 인 pinvoke를 사용하여 (예를 들어) .so 파일에서 함수를 호출 할 수도 있습니다. – Evk

+1

결국, .so는 Linux 용입니다. Windows 용 .dll은 프로그램에서 사용할 수있는 동적 라이브러리입니다. – xanatos

+0

감사! 내 함수가 들어있는 lib.so 파일을 썼지 만 C# 프로그램에서 호출하려고하면 System.EntryPointNotFoundException이 발생합니다. 내가 어떻게 든 내 생각 엔 [code] extern "C"__declspec (dllexport) [/ code]로 함수를 선언했기 때문이다. 올바른 선언은 무엇입니까? – rele92

답변

1

라이브러리는 어떻게 생겼습니까? 그들로부터 .so을 (를) 생성 할 수 있습니까? 그렇다면 모든 것이 좋습니다. 내가 아는 한 MONO는 적절한 수준에서 interop을 처리 할 수 ​​있습니다.

MONO Interop

당신이 (link1link2)를 호출 규칙에 대해 관심을 가져야 있습니다 아마도 전체 양식을 사용하십시오 : 나는 Cdecl이 적합하다고 생각하여 extern "C"를 들어

[DllImport("mylib.so", EntryPoint = "my_func1", CallingConvention = CallingConvention::Cdecl, CharSet = CharSet::Ansi)] 

을 (그리고 경우 다른 사람을 확인하지 마세요^- ^)

위의 MONO 문서 링크에서 :

호출 규칙은 마이크로 소프트 비주얼 C에서 ++ 및 GCC 아래 __attribute__((stdcall))__attribute__((cdecl)) 컴파일러 내장 함수를 사용하여 __stdcall__cdecl 컴파일러 내장 함수를 사용하여 C 코드를 지정할 수 있습니다.

면책 조항 : MONO (어떤 C/C++ 컴파일러를 사용하는지 알지 못함)를 사용하여 확인해야합니다.