문제

C #으로 SWIG 라이브러리를 사용한 사람이 있습니까?그렇다면 어떤 함정을 발견했으며 라이브러리를 사용하는 가장 좋은 방법은 무엇입니까?C로 작성된 프로그램의 래퍼로 사용할 생각이고 헤더 파일을 래핑하여 .NET 응용 프로그램에서 사용할 수 있습니다. 편집 : 대상 OS에 대한 설명.

저는 Linux와 Windows에서 응용 프로그램을 실행할 계획이므로 SWIG를 살펴보고 있습니다.P / Invoke는 옵션이 아닙니다.

도움이 되었습니까?

해결책

이전 포스터의 실수는 예제를 보지 않고 문서를 읽은 것 같습니다.

몇 시간 전에 일부 C ++ 클래스를 C #에 인터페이스해야했습니다. 나는 내 Swig dir (이미 다른 작업을 위해 가지고 있었다)을 살펴보고, Examples/csharp/class 디렉토리를 찾고, 코드를 찾아보고, 솔루션을로드하고, 그로 킹하고, 복사하고, 코드를 입력하고, 작동했고, 내 작업이 완료되었습니다.

하지만 생성 된 P / Invoke 코드는 모든 요구 사항에 대한 솔루션이 아닙니다. 프로젝트에 따라 간단한 API 래퍼를 직접 작성하거나 관리되는 C ++를 작성하는 것만 큼 간단 할 수 있습니다 (이에 대한 훌륭한 예는 SlimDX를 참조하십시오).

제 필요에 따라 간단하고 쉬웠습니다. 저는 mystuff.dll를 가지고 있었고, 추가로 mystuffnet.dll를 발송할 수 있습니다. 문서에 들어가기가 어렵다는 데 동의합니다.

편집 : OP에서 C 만 언급 한 것을 확인했습니다.이를 위해 Swig가 실제로 필요하지는 않습니다. 일반적인 C # / C DLLImport interop 구문 . Swig는 C #에서 C ++ 클래스 를 호출 할 때 유용합니다.

다른 팁

마지막 프로젝트의 전체 C # SWIG 구성 파일은 다음과 같습니다. 라코 디스

SWIG에서 다음과 같이 컴파일했습니다. 라코 디스

이것은 내가 컴파일하고 'main'DLL에 직접 링크 한 Project.cxx를 생성했기 때문에 두 번째 C ++ 'helper'DLL이 필요하지 않았습니다.SWIG는 또한 .NET DLL로 컴파일 한 많은 C # 파일을 생성했습니다.다른 래퍼 (Java, PHP 등)는 도우미 DLL을 사용합니다.

@patrick이 언급했듯이 SWIG는 P / Invoke를 사용하므로 문제가있는 경우 다른 솔루션을 찾아야합니다.

일반적인 유형 (공극, 구조 등)에서 벗어나는 유형을 사용하는 경우 제대로하려면 추가 작업을 수행해야하지만 int, char * 등을 사용하는 평균 API의 경우 괜찮습니다.

몇 년 전에 SWIG를 사용하여 .NET에서 사용할 프로젝트 C ++를 래핑하려고했습니다.

SWIG에 필요한 구성을 생성하는 것이 엄청난 고통이라는 점에서 그다지 멀지 않았습니다.그 당시 나는 다른 언어 / api / 등을 배우는 것이 아니라 해결책을 원했습니다.요즘에는 SWIG가 사용하기 더 쉬울 수 있지만 말씀 드릴 수는 없습니다.

우리는 결국 Managed C ++를 사용하여 C ++ 프로젝트를 래핑했습니다.정말 잘 작동했습니다.

dll에서 바로 함수를 호출하는 경우 위의 두 가지 중 하나에 대해 걱정하지 말고 P / Invoke

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top