2016-11-15 31 views
0

我正在使用32位ETL工具(Pervasive Data Integrator v9)。我需要赋予这个工具调用外部函数的能力,该函数将从ZIP压缩文件中删除文件,而不用提取压缩文件。通过混合模式C++/CLI DLL使用来自ETL工具的托管C#DLL - 可能吗?

ETL工具提供加载外部DLL并调用其功能的能力。该DLL,其功能得到由ETL工具的自定义脚本语言中引用这样的:

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

功能(OemToCharA在这个例子中),然后某处调用的脚本的遵循该声明的线条。我已经用一个已注册的DLL测试过了,它可以工作。

所以我想建立一个DLL的函数,将执行zip操作。

因为我不知道如何以编程方式处理zip文件,所以我发现了DotNetZip - 一个免费的.NET类库,为zip归档操作提供了强大的功能。问题在于它是.NET(托管)。我仍然想尝试使用它。所以我建立了一个C#DLL(.NET 4.0),它具有一个利用DotNetZip来执行所需的zip文件操作的功能。我传入两个参数,“zip文件位置”和“要删除的文件”,并且zip存档被更新。

我读到了构建混合模式C++/CLI DLL以利用本机世界中的托管.NET代码的想法。我发现this VS溶液,其由3个基本项目:

  1. 托管(C#)DLL项目
  2. 混合模式C++ DLL包装项目它引用C#DLL
  3. 原生(非托管)C++控制台测试引用C++封装的应用程序项目

我构建了一个基于该模式的测试解决方案,该解决方案从zip压缩文件中移除文件,效果很好。但请注意,混合模式DLL是从本地C++控制台应用程序调用的,该应用程序是VS解决方案的一部分。我没有注册任何DLL,它只是工作。

但是最终我需要ETL工具来调用混合模式DLL。我无法得到这个工作。

事情我必须在ETL服务器上迄今为止尝试:

  • 我试图注册混合模式包装DLL但SYSWOW64 \ REGSVR32无法在DLL中找到一个切入点。
  • 我在ETL服务器上安装了VS 2015 VC++ x86和x64可再发行组件库。
  • 我在ETL引擎文件夹中放置了我的解决方案中的DLL(即混合模式,c#和dotnetzip dll),因为控制台应用程序在DLL位于其deploy文件夹中时工作。

的ETL工具必须调用外部应用程序的能力,所以我相信我会让它调用类似我VS测试解决方案控制台应用程序,但我真的很想得到这个只用DLL的工作。这可能吗?如果是这样,我错过了什么?

+0

由于混合DLL不是COM DLL,因此不需要运行regsvr32。除了C++运行时,你是否在目标机器上安装了.NET?你所有的DLL是32位的吗? – Matt

+0

谢谢Matt,在目标机器上安装了.NET,我验证4.0存在。我可能在这里显示我的无知,但我相信这些DLL都是32位的。控制台应用程序和混合模式DLL项目的目标平台是Win32。 C#DLL的目标平台是Any CPU。不知道如何判断他们是否是32位? –

+0

目标机器是Windows Server 2012 R2 Datacenter –

回答

0

马特的荣誉,感谢您使用Process Monitor的提示。

  • ETL工具是没有找到DLL,但进程监视器告诉我这是检查文件夹...我感动的DLL文件到选中的文件夹中的一个
  • 我的包装功能原本与输出参数无效返回值 - 这是导致问题的原因,因为我在ETL文档中没有很好的示例来介绍如何调用void函数。我改变了函数返回一个“长”,并删除了输出参数。

做出这两个更改后,它开始工作。再次感谢马特!