2010-07-21 2 views
0

몇 가지 종속성이있는 네이티브 C++ 코드를 래핑하는 C++/CLI 라이브러리를 올바르게 설정하는 방법에 대해 궁금합니다. 필자는 정적 라이브러리와 네이티브 라이브러리를 종속 라이브러리에 정적으로 링크하려고 시도했습니다.어떻게 C#에서 다중 종속 라이브러리로 원시 코드를 래핑하는 C++/CLI dll을 사용할 수 있습니까?

Managed C++/CLI dll은 제대로 구축되며 C# 프로젝트에 대한 참조로 추가 될 수 있습니다. 그러나 내가 정의 된 클래스 중 하나를 사용하려고하면 BadImageFormatException 또는 FileNotFoundException 중 하나가 나타납니다. CLI 라이브러리에서 종속 라이브러리를 지정하여 매니페스트에로드 할 필요가 있다고 판단하지만 프로세스가 확실하지 않습니다. 또한 내가 알게 될 것이기 때문에 관련된 모든 라이브러리가 x86 아키텍쳐를 기반으로 만들어 졌음을 확인했다.

+0

그들 사이에 C++/CLI가 필요합니까? 나는 그것 없이는 훨씬 더 쉽다. belevie –

+0

@lukas : 어떤 이유가 있어야한다. – Behrooz

+0

@lukas P/Invoke를 반복해서 사용하는 것을 피하기 위해 C++/CLI를 사용하고있었습니다. 필자가 읽은 것에서 P/Invoke 나 CLI wrappers 중 하나와 wrapper가 더 합리적인 것처럼 보였다. 그러나 이것은 처음하는 일입니다. – JMcCarty

답변

2

문제를 파악하고 모든 것이 올바르게 작동하고 있습니다. 그것은 함께 일어나는 몇 가지 부정확 한 것들의 조합이었습니다.

1) 참조 하였다 부스트 라이브러리 (특히 boost_thread) BOOST_THREAD_USE_DLL 전처리 컴파일 할 필요가 (다른 부스트 라이브러리가 필요할 수 있습니다 BOOST_ALL_DYN_LINK : 사람이 같은 문제가있는 경우

, 나는 다음을 설정하여 해결 모든 것을 동적으로 링크시키는 것). 이것은 분명히 공통적 인 문제입니다.

2) 나는 내 컴파일 된 관리되는 DLL을 분석 DependencyWalker 소스 포지에서 (Depends.exe를)를 사용)

3) R Ubben이 반복처럼 모든 종속성이 (시스템 경로에서 검증 하였다. 실제로 사용되는 libpq.lib 라이브러리는 lib 폴더에는 없지만 bin 폴더에는 포함 된 추가 DLL을 참조하는 것으로 나타났습니다. 그래서 그 경로에 추가해야합니다.

4) 래퍼의 일부가 목록에 #include 헤더를 사용하고있었습니다. 이로 인해 내 라이브러리는 2.0 프레임 워크 종속 라이브러리에 연결되었습니다. 이것은 내 4.0 클라이언트 대상 C# 응용 프로그램과 호환되지 않았습니다. 이것은 컴파일을 통해 (이전에는 C++로 인해 너무 많이 생성 되었기 때문에 숨겨진) 경고를 통해 구문 분석 한 것으로 만 알 수있었습니다. 그러나 동일한 x86 아키텍처를 대상으로하는 모든 작업에도 불구하고 System.BadImageFormateException이 발생했습니다.

같은 문제가있는 다른 사용자에게 도움이되기를 바랍니다. BadImageFormateException 및 FileNotFoundException은 너무 애매하고 도움이되지 않았습니다.

0

릴리스 모드에서는 C++ dll을 만들고 정적 정적 인 경우에는 extern "C"를 사용해야합니다.

+0

나는 dll이 릴리즈 모드로 만들어졌으며 공개 된 가시성을 가진 모든 함수가 필요하다는 것을 확신했다. C++/cli dll은 링크가없는 한 링크하지 않습니다. – JMcCarty

0

종속 라이브러리가 경로에없는 경우 해당 오류가 발생했습니다. 래퍼 라이브러리는 참조 때문에 발견되었지만 참조는 종속 라이브러리를 처리하지 않습니다. 프로그램이 실행되는 곳에서 명시 적으로 배치하십시오.

+0

나는 경로 문제일지도 모른다고 생각했다. 라이브러리에 대한 경로가 % Path %에 존재하고 dll이 실행 위치에 복사됩니다. 혹시 문제가되는 라이브러리는 PostgreSQL의 libpq.lib/dll입니다. – JMcCarty

관련 문제