通过混合模式c++ /CLI DLL从ETL工具中使用托管c# DLL -可能

本文关键字:DLL 可能 工具 ETL 模式 混合 c++ CLI | 更新日期: 2023-09-27 18:18:00

我使用的是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测试过了,它可以工作。

所以我想用一个函数来构建一个DLL来做压缩操作。

由于我不知道如何以编程方式操作zip文件,我找到了DotNetZip——一个免费的。net类库,它为zip归档操作提供了繁重的工作。对我来说,问题是它是。net(托管的)。我仍然想尝试使用它。所以我建立了一个c# DLL。. NET 4.0),该函数利用DotNetZip执行所需的zip文件操作。我传入两个参数,"zip文件位置"answers"要删除的文件",zip存档得到更新。

我读到关于构建一个混合模式c++/CLI DLL的想法,以利用本机世界中的托管。net代码。我发现这个VS解决方案由3个基本项目组成:

    托管(c#) DLL项目
  1. 引用c# DLL的混合模式c++ DLL包装器项目
  2. 本机(非托管)c++控制台测试应用程序项目,引用c++包装器

我基于该模式构建了一个测试解决方案,它从zip存档中删除了一个文件,并且工作得很好。但是请注意,混合模式DLL是从本地c++控制台应用程序调用的,这是VS解决方案的一部分。我不需要注册任何dll,它就可以工作了。

然而,最终我需要ETL工具来调用混合模式DLL。我不能让这个工作。

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

  • 我试图注册混合模式包装器DLL,但SysWow64'regsvr32未能在DLL中找到入口点。
  • 我在ETL服务器上安装了vs2015 vc++ x86和x64可分发库。
  • 我把dll从我的解决方案(即,混合模式,c#和dotnetzip dll)在ETL引擎文件夹中,因为控制台应用程序工作时,dll在其部署文件夹。

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

通过混合模式c++ /CLI DLL从ETL工具中使用托管c# DLL -可能

向Matt致敬,感谢您提示使用Process Monitor

  • ETL工具没有找到DLL,但进程监视器告诉我它正在检查的文件夹…我将dll移动到选中的文件夹
  • 我的包装器函数最初是带有返回值的输出参数的void -这导致了问题,因为我在ETL文档中没有一个关于如何调用void函数的好例子。我将函数更改为返回"long"并删除了输出参数。

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