我在32位ETL工具(普适数据集成器v9)中工作。我需要让这个工具能够调用一个外部函数,该函数将从ZIP存档中删除文件,而不提取存档。
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个基本项目:
-
托管(C#)DLL项目
-
混合模式C++DLL包装器项目,它引用C#DLL
-
本机(非托管)C++控制台测试应用程序项目,它引用C++包装器
我基于该模式构建了一个测试解决方案,它从zip存档中删除一个文件,效果非常好。但是,请注意,混合模式DLL是从作为VS解决方案一部分的本机C++控制台应用程序调用的。我不需要注册任何DLL,它可以正常工作。
然而,最终我需要ETL工具来调用混合模式DLL。我没办法让它工作。
-
我试图注册混合模式包装器DLL,但SysWow64\regsvr32在DLL中找不到入口点。
-
我在ETL服务器上安装了VS2015 VC++x86和x64可再发行库。
-
ETL工具具有调用外部应用程序的能力,因此我相信我可以让它调用类似于我的VS测试解决方案的控制台应用程序,但我真的希望它只使用DLL。这可能吗?如果是,我缺少什么?