我在32位ETL工具(Pervasive Data Integrator v9)中工作。我需要让这个工具能够调用一个外部函数,该函数将从ZIP存档中删除文件而不提取存档。
ETL工具提供加载外部DLL并调用其功能的功能。 DLL及其函数由ETL工具的自定义脚本语言引用,如下所示:
Declare function OemToCharA lib "user32" (byval lpszSrc as string, byval lpszDst as string) as long
然后在该声明后面的脚本行中的某处调用该函数(在此示例中为OemToCharA)。我已经使用已注册的DLL对其进行了测试,但它确实有效。
所以我想用一个可以进行zip操作的函数构建一个DLL。
由于我不知道如何以编程方式操作zip文件,我找到了 DotNetZip - 一个免费的.NET类库,它为zip存档操作提供了繁重的工作。对我来说问题是它是.NET(托管)。我仍然想尝试使用它。所以我构建了一个C#DLL(.NET 4.0),其功能是利用DotNetZip来完成所需的zip文件操作。我传递了两个参数,“zip文件位置”和“要删除的文件”,并且zip存档得到更新。
我读到了构建混合模式C ++ / CLI DLL以利用本机中托管.NET代码的想法。我找到了this VS解决方案,它由3个基本项目组成:
我构建了一个基于该模式的测试解决方案,它从zip存档中删除了一个文件,效果很好。但请注意,混合模式DLL是从本机C ++控制台应用程序调用的,该应用程序是VS解决方案的一部分。我没有注册任何DLL,它只是工作。
但最终我需要ETL工具来调用混合模式DLL。我无法让它发挥作用。
到目前为止我在ETL服务器上尝试过的事情:
ETL工具能够调用外部应用程序,所以我相信我可以让它调用类似于我的VS测试解决方案的控制台应用程序,但我真的想让它只与DLL一起使用。这可能吗?如果是这样,我错过了什么?
答案 0 :(得分:0)
向Matt致敬,感谢提示使用Process Monitor。
完成这两项更改后,它开始工作。再次感谢马特!