2009-04-19 8 views
4

.NET 응용 프로그램에 표시 할 C++ DLL (코드 없음)이 있습니다.네이티브 C++ DLL을 .NET에 래핑하는 DLL 종속성 추적

내가 아는 모든 옵션에 대해 숙고 한 후에 (COM, P/Invoke, SWIG 등) 찾을 수 있지만 .NET 클래스 라이브러리 (C++/CLI)를 작성하고 있습니다. 이제 결과 DLL (클래스 라이브러리)에는 원본 DLL과 그 종속성이 필요합니다. 내 문제는 자동으로 이러한 것들을 추적하므로 래퍼를 사용하는 응용 프로그램은 다른 DLL을 추적 할 필요가 없습니다 (특히 원본 DLL이 새로운 종속성을 개발하는 경우).

좀 더 정확하게 (그리고 토론 할 구체적인 내용이 있음) cmr을 랩핑하려하고 있으므로 MR 클래스 라이브러리 (자연히 cmr에 따라 다름)를 작성합니다. cmrPNL, OpenCV 및 기타에 따라 다릅니다. MR에 대한 참조를 (C#) 프로젝트에 추가하려고 시도했을 때 Visual Studio (2005 SP1)가 MR.DLL을 복사하고 모든 종속성을 남기고 난 다음에 불평합니다 (누락 된 모듈에 대해서는 FileNotFoundException이 표시됨). 수동으로 cmr, PNL 등을 bin 디렉토리에 복사하면 문제가 해결됩니다.

더 이상의 고민없이, 내 질문은 : .NET 애플 리케이션을 하나의 DLL에 대한 참조를 추가하는 방법이 있습니까, 그리고 모든 그냥 작동?

나는 Google을 통해 수색 봤는데 SO, 아무 소용이 ...

편집 : mergebin는 가장 가까운 것 같다 내가 무엇을 찾고 있어요,하지만 그것은 단지와 .NET DLL을 병합 할 수 있습니다 하나의 네이티브 DLL. 너무 나쁜 DLL은 네이티브 DLL을 병합 할 수 없습니다. 당신은 두 가지 특정 문제를 가지고있는 것처럼

답변

6

관리되지 않는 DLL과 관리되는 DLL을 하나의 어셈블리로 결합 할 수있는 도구 인 mergebin을 살펴보십시오.System.Data.SQLite은이 방법을 사용합니다.

0

는 소리 :

  1. 빌드 동적 경우 복사 할 필요가 네이티브 코드 의존성을 파악하는 방법
  2. 를 시작하기 전에 네이티브 코드 DLL을 통해 복사하는 방법 그들은 변화한다.

1)의 경우 C# 프로젝트에서 미리 빌드 단계를 사용하여 사용자 정의 유틸리티를 호출하여 올바른 파일을 복사 할 수 있습니다.

2)는 이미 answered here on Stack Overflow입니다.

0

음, 빌드 프로세스의 일부로 필요한 DLL을 올바른 출력 디렉터리에 자동으로 복사하는 명령을 추가하기 만하면됩니다. 이것은 Visual Studio에서 프로젝트 속성으로 이동하여 수행됩니다.

프로젝트 -> MyProjectName 속성 ... -> 당신이 $ (있는 TargetPath)에 필요한 파일을 복사하는 명령을 추가하면 완료 이벤트

을 구축 할 수 있습니다.

다른 옵션은 프로젝트의 현재 작업 디렉터리 (Visual Studio에서만 실행하는 경우)를 필요한 DLL이있는 디렉터리로 설정하는 것입니다. 외부에서 프로그램을 실행할 때 파일을 수동으로 복사해야하지만 개발이 조금 쉬울 것입니다.

2

저는 현재 매우 비슷한 문제가 있습니다.

너무 내 목표를 달성 하나의 큰 단계는 이것은에 기록 링커 옵션

/ASSEMBLYLINKRESOURCE:"$(OutDir)\Native.dll" 

를 C++/CLI 프로젝트에 미리 구축 단계에서 출력 디렉토리에 기본 .DLL을 복사하여 추가했다

어셈블리에 속한 파일 "Native.dll"이 생성됩니다. 해당 프로젝트/어셈블리를 참조하는 모든 프로젝트가 Native.dll을 복사합니다. (만약 당신이 거기에 의회를 세우고 자한다면 GAC에 가야합니다 - 나는 그것을 확인하지 않았습니다).

그래, 여전히 native.dll에 따라 모두 추가해야합니다. Assembly.LoadFrom()을 통해 매우 다른 경로에서 어셈블리를로드하면 런타임시 네이티브 DLL이 발견되는지 여부도 알 수 없습니다 (이 문제는 C++/CLI 래퍼 Visual Studio 디자이너가 어셈블리를 필요로 함).

이 정보가 도움이되기를 바랍니다.

는 편집 :

추가 조사는이 좋은 일 ... 래퍼 .DLL 항상 기본 .DLL을 발견 한 것으로 나타났다. 나쁜 점은 Visual Studio Designer가 양식을 열 때 필요한 어셈블리를 임시 디렉토리 (사용자 디렉토리의 어딘가에)에 복사한다는 것입니다. 어셈블리를 복사 할 때 링크 된 리소스를 무시하고 기본 .DLL!

+0

+1 좋은 방법입니다. 네이티브 dll 이름은 관리되는 dll 매니페스트에 포함됩니다. 빌드 도구 (적어도 이론적으로)는 DLL이 여전히 돌아 다니고 있지만 네이티브 종속성을 파악할 수 있습니다. 웹 배포 시나리오에서 잘 작동합니다. – tivadj

관련 문제