2010-11-23 4 views
4

은 관리 코드 (어쩌면 클래스 또는 라이브러리)로 작성된 C# 메서드를 원시 C 코드 (및 방법)에서 호출 할 수 있습니까?howto는 C# (모노, .net) 메서드를 호출하고 native C의 대리자

들으

편집 : "C#을"나는 대부분 또는 심지어 portable.net 모노 참조하여 OS가 리눅스

입니다 함께
+0

가능한 중복 [C#을 방법을 내보내는 방법?] (http://stackoverflow.com/questions/2082159/how-to-export-c-methods) –

답변

6

C 코드는 콜백을 등록 할 함수를 정의 할 수 있습니다. C# 코드는 이러한 함수를 P/호출하고 관리되는 대리자를 인수로 전달할 수 있습니다. 마샬링 코드는 이들을 C 함수 포인터로 투명하게 변환합니다.

또는 C 측에서 접근하면 Mono 포함 API를 사용하여 어셈블리를로드하고 MonoMethods를 찾아보고 호출 할 수 있습니다.

퍼가기 API를 사용하는 것은 훨씬 더 복잡합니다. 진입 점이 C 언어 인 경우에는 임베딩 API를 사용해야하지만 콜백 등록 및 기타 관리 설정을 수행하는 관리되는 메소드를 작성하는 것이 더 쉽습니다. 그런 다음 해당 단일 메소드를로드하고 호출하면됩니다. C 코드에서.

+0

진입 점은 때때로 C에서 어셈블러가 될 수도 있습니다. 그럼 내가이 http://www.mono-project.com/Embedding_Mono 지침을 따라 가려고합니다. 당신이 좋은 다른 튜토리얼을 가지고 있다면 나에게 말해 줄 수있다. – Gobliins

+0

모노에서 C 코드를 사용할 때는 일반적으로 dllimport를 사용합니다. – Gobliins

2

당신을 위해 도움이 되거 수있는 MSDN 사이트에 Overview of Managed/Unmanaged Code Interoperability을있다.

가 직접 관리되는 API 관리되지 않는 클라이언트가 C++로 작성된 경우

, 그것은 "혼합 모드로 의 Visual Studio .NET C++ 컴파일러로 컴파일 할 수 있습니다 액세스 : 아래 발췌 영상." 이 완료되면 관리되지 않는 클라이언트가 에 관리되는 API에 직접 액세스 할 수 있습니다. 그러나 관리 대상 개체에 관리되지 않는 코드에 액세스하려면 일부 코딩 규칙이 적용됩니다. 자세한 내용은 C++ 설명서를 확인하십시오.

직접 액세스는 관리 대상 API 에서 특별히 고려해야 할 특별한 이유가 없으므로 입니다. 관리되는 API 디자인 가이드 라인 (DG)에 따라 관리되는 API를 디자인하고 비 관리되는 호출자가 API가 여전히 에 액세스 할 수 있다고 확신하는 을 확신 할 수 있습니다. 모든 공공 관리 클래스가 가 COM의 상호 운용성을 통해 관리되지 않는 클라이언트에 노출 될 수있는 COM API를

같은 관리 API를 노출

. COM interop 레이어가 모든 COM 배관을 처리하기 때문에이 프로세스는 매우 간단합니다. 구현해야합니다. 따라서 예를 들어 관리되는 클래스는 모두 IUnknown, IDispatch, ISupportErrorInfo 및 기타 표준 COM 인터페이스를 구현하는 것처럼 보입니다.

API를 COM API로 노출하는 것이 쉽고 관리되고 COM 개체 모델이 매우 다르다는 사실에도 불구하고. 따라서 관리되는 API를 COM 에 노출하는 것은 명시 적 디자인 인 결정이어야합니다. 에서 사용할 수있는 일부 기능은 COM 세계에서 해당 사항이없고 은 COM 클라이언트에서 사용할 수 없습니다. 로 인해 관리되는 API 디자인 지침 (DG)과 COM과의 호환성이 긴장되는 경우가 있습니다. COM 클라이언트가 중요하다면

의 관리 API 디자인 지침에 따라 관리되는 API를 작성하고 는 얇은 COM 친화적 인 가 COM에 노출되는 관리되는 API 주위에 래퍼를 관리 물품.

때로는 관리되지 않는 클라이언트가 COM을 사용할 수 없습니다 플랫 API로 관리되는 API를 노출

. 예를 들어 플랫 API를 사용하기 위해 이미 으로 작성되었을 수 있으며 을 변경하거나 다시 컴파일 할 수 없습니다. C++은 API로 관리 API를 공개 할 수있게 해주는 고급 언어 인 입니다. 이렇게하면 처럼 관리되는 API가 COM API로 표시되기 쉽지 않습니다. 매우 고급 기술이며 고급 지식 C++ interop 및 관리되는 과 관리되지 않는 세계 간의 차이점이 필요합니다.

절대적으로 필요한 경우에만 관리 API를 플랫 API 으로 노출하십시오. 에 선택의 여지가없는 경우 C++ 설명서를 확인하고 의 모든 제한 사항을 숙지하십시오.

+0

C++/CLI는 Windows에서만 작동하고, "모노"태그가 있으면 플랫폼 간 지원이 바람직 함을 나타냅니다. –

+0

걱정하지 마세요, 당신은 받아 들여진 답을 얻었습니다. – Lazarus

관련 문제