2016-11-15 1 views
0

32 비트 ETL 도구 (Pervasive Data Integrator v9)에서 작업하고 있습니다. 이 도구는 압축을 풀지 않고도 ZIP 압축 파일 내에서 파일을 제거하는 외부 함수를 호출 할 수 있어야합니다.혼합 모드 C++/CLI DLL을 통한 ETL 도구의 Managed C# DLL 활용 - 가능합니까?

ETL 도구는 외부 DLL을로드하고 해당 함수를 호출하는 기능을 제공합니다. DLL을하고 그 기능은 다음과 같이 ETL 툴의 사용자 정의 스크립트 언어에 의해 참조됩니다 : (이 예에서는 OemToCharA)

Declare function OemToCharA lib "user32" (byval lpszSrc as string, byval lpszDst as string) as long 

기능 그 선언에 따라 스크립트의 라인 어딘가에이라고합니다. 나는 이것을 등록 된 DLL로 테스트했으며 작동한다.

그래서 zip 조작을 수행하는 함수로 DLL을 만들고 싶습니다.

프로그래밍 방식으로 zip 파일을 조작하는 방법을 모르므로 DotNetZip - zip 보관 작업에 많은 부담을주는 무료 .NET 클래스 라이브러리를 발견했습니다. 문제는 .NET (관리)입니다. 나는 여전히 그것을 사용하려고합니다. 그래서 DotNetZip을 사용하여 필요한 zip 파일 조작을 수행하는 함수로 C# DLL (.NET 4.0)을 만들었습니다. 나는 "zip 파일 위치"와 "제거 할 파일"의 두 매개 변수를 전달하고 zip 아카이브는 업데이트됩니다.

네이티브 환경에서 관리되는 .NET 코드를 활용하기 위해 혼합 모드 C++/CLI DLL을 작성한다는 아이디어를 읽었습니다.

    는 C# DLL을 참조
  1. 관리 (C#을) DLL 프로젝트
  2. 혼합 모드 C++ DLL 래퍼 프로젝트
  3. 네이티브 (관리되지 않는) C++ 콘솔 테스트 : 나는 3 개 기본 프로젝트로 구성 this VS 솔루션을 발견 C++ wrapper를 참조하는 app 프로젝트

나는 zip 아카이브에서 파일을 제거하는 패턴을 기반으로 테스트 솔루션을 만들었으며 훌륭하게 작동합니다. 그러나 혼합 모드 DLL은 VS 솔루션의 일부인 네이티브 C++ 콘솔 앱에서 호출됩니다. DLL을 등록 할 필요가 없으며 작동합니다.

그러나 궁극적으로 혼합 모드 DLL을 호출하려면 ETL 도구가 필요합니다. 나는 이것을 작동시킬 수 없다. 내가 지금까지 ETL 서버에 시도

것들 :

  • 나는 혼합 모드 래퍼 DLL을 등록하려고했지만 SysWOW64와 \의에 regsvr32은 DLL의 진입 점을 찾을 실패합니다.
  • ETL 서버에 VS 2015 VC++ x86 및 x64 재배포 가능 라이브러리를 설치했습니다.
  • DLL이 배포 폴더에있을 때 콘솔 앱이 작동했기 때문에 솔루션 (예 : 혼합 모드, C# 및 dotnetzip dll)에서 DLL을 ETL 엔진 폴더에 배치했습니다.

ETL 도구는 외부 응용 프로그램을 호출 할 수있는 기능을 갖추고 있으므로 VS 테스트 솔루션과 비슷한 콘솔 응용 프로그램을 호출 할 수 있다고 생각하지만 실제로는 DLL 만 사용하려고합니다. 이것이 가능한가? 그렇다면 무엇을 놓치고 있습니까?

+0

혼합 DLL이 COM DLL이 아니므로 regsvr32를 실행할 필요가 없습니다. C++ 런타임 외에 대상 컴퓨터에 .NET을 설치합니까? 모든 DLL이 32 비트입니까? – Matt

+0

감사합니다. Matt, 예. .NET이 대상 컴퓨터에 설치되었지만 4.0이 존재 함을 확인했습니다. 아마 여기에 내 무지를 보여주는 오전하지만 DLL을 모두 32 비트 믿습니다. 콘솔 응용 프로그램 및 혼합 모드 DLL 프로젝트의 대상 플랫폼은 Win32입니다. C# DLL의 대상 플랫폼은 모든 CPU입니다. 그들이 32 비트인지 어떻게 알 수 있습니까? –

+0

대상 컴퓨터가 Windows Server 2012 R2 Datacenter –

답변

0

명예의 전당, Process Monitor를 사용하는 데 감사드립니다.

  • ETL 도구는 DLL을 찾지 못하는했지만 프로세스 모니터는
  • 내 래퍼 함수는 출력 매개 변수와 원래 공허 내가 체크 폴더 중 하나에 DLL을 이동 ... 나에게 그것을 확인 된 폴더를 말했다 리턴 값 - void 함수를 호출하는 방법에 대한 ETL 문서의 좋은 예가 없기 때문에 문제를 일으켰습니다. "long"을 리턴하고 출력 매개 변수를 제거하도록 함수를 변경했습니다.

두 가지 변경 사항을 적용한 후에 작업이 시작되었습니다. 다시 한 번 고마워!