2016-11-15 11 views
0

Я работаю в 32-битном инструменте ETL (Pervasive Data Integrator v9). Мне нужно дать этому инструменту возможность вызвать внешнюю функцию, которая удалит файл из ZIP-архива без извлечения архива.Использование управляемой C# DLL из инструмента ETL через смешанный режим C++/CLI DLL - возможно?

Инструмент ETL предоставляет возможность загрузки внешней библиотеки DLL и вызова ее функций. DLL и его функция получает ссылки на язык пользовательского сценария ETL инструмента, как это:

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

функция (OemToCharA в данном примере) Затем вызывается где-то в строках сценария, которые следуют этой декларации. Я протестировал это с помощью зарегистрированной DLL, и он работает.

Так что я хочу построить DLL с функцией, которая будет делать манипуляции с почтовым индексом.

Поскольку я не умею манипулировать zip-файлами программно, я нашел DotNetZip - бесплатная библиотека классов .NET, которая обеспечивает тяжелый подъем для операций архивирования ZIP. Проблема для меня в том, что это .NET (управляемый). Я все равно хотел бы попытаться использовать его. Поэтому я построил C# DLL (.NET 4.0) с функцией, которая использует DotNetZip для выполнения необходимых манипуляций с zip-файлами. Я передаю два параметра: «zip file location» и «file to remove», и zip-архив обновляется.

Я читал об идее создания смешанной C++/CLI DLL, чтобы использовать управляемый код .NET в родном мире. Я нашел this решение VS, который состоит из 3-х основных проектов:

  1. Managed (# C) DLL проект
  2. в смешанном режиме C++ DLL обертка проект, который ссылается на C# DLL
  3. Уроженец (неуправляемый) C++ консоль тестирования app project, который ссылается на обертку C++

Я построил тестовое решение на основе этого шаблона, который удаляет файл из zip-архива, и он отлично работает. Обратите внимание, однако, что DLL смешанного режима вызывается из собственного консольного приложения на C++, которое является частью решения VS. Мне не нужно было регистрировать DLL, и это просто работает.

Однако в конечном итоге мне нужен инструмент ETL для вызова DLL смешанного режима. Я не могу заставить это работать.

Вещи я пытался на сервере ETL до сих пор:

  • Я пытался зарегистрировать в смешанном режиме обертка DLL, но SysWow64 \ regsvr32 не удается найти точку входа в DLL.
  • Я установил VS 2015 VC++ x86 и x64 распространяемые библиотеки на сервере ETL.
  • Я поместил библиотеки DLL из своего решения (т. Е. Смешанного режима, C# и dotnetzip dll) в папку с движком ETL, потому что консольное приложение работало, когда библиотеки DLL находились в папке развертывания.

Инструмент ETL имеет возможность вызова внешнего приложения, поэтому я считаю, что позволю ему вызвать консольное приложение, похожее на мое тестовое решение VS, но мне бы очень хотелось, чтобы это работало только с DLL. Это возможно? Если да, то что мне не хватает?

+0

Вам не нужно запускать regsvr32, поскольку смешанная DLL не является COM-DLL. Помимо среды выполнения C++, вы устанавливаете .NET на целевую машину? Все ли вы DLL 32-разрядные? – Matt

+0

Спасибо Matt, да .NET установлен на целевой машине, я проверял 4.0. Вероятно, я покажу свое невежество, но я считаю, что библиотеки DLL - все 32-битные. Целевая платформа для консольного приложения и DLL-проектов смешанного режима - Win32. Целевой платформой для C# DLL является любой процессор. Не знаете, как еще сказать, если они 32-битные? –

+0

Целевая машина - это Windows Server 2012 R2 Datacenter –

ответ

0

Kudos to Matt, спасибо за подсказку использования Process Monitor.

  • ETL инструмент не найти DLL, но Process Monitor сказал мне папки была проверка ... Я переехал библиотеки DLL в одном из проверяемых папок
  • Моей функции обертки была первоначально аннулируется с выходными параметром для возвращаемое значение - это вызывало проблемы, поскольку у меня не было хорошего примера в документации ETL о том, как вызвать функцию void. Я изменил функцию, чтобы вернуть «длинный» и удалить выходной параметр.

После выполнения этих двух изменений он начал работать. Еще раз спасибо!