Я работаю в 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-х основных проектов:
- Managed (# C) DLL проект
- в смешанном режиме C++ DLL обертка проект, который ссылается на C# DLL
- Уроженец (неуправляемый) 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. Это возможно? Если да, то что мне не хватает?
Вам не нужно запускать regsvr32, поскольку смешанная DLL не является COM-DLL. Помимо среды выполнения C++, вы устанавливаете .NET на целевую машину? Все ли вы DLL 32-разрядные? – Matt
Спасибо Matt, да .NET установлен на целевой машине, я проверял 4.0. Вероятно, я покажу свое невежество, но я считаю, что библиотеки DLL - все 32-битные. Целевая платформа для консольного приложения и DLL-проектов смешанного режима - Win32. Целевой платформой для C# DLL является любой процессор. Не знаете, как еще сказать, если они 32-битные? –
Целевая машина - это Windows Server 2012 R2 Datacenter –