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

时间:2016-11-15 20:38:31

标签: c# c++ dll unmanaged managed

我在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个基本项目组成:

  1. 托管(C#)DLL项目
  2. 引用C#DLL的混合模式C ++ DLL包装器项目
  3. 引用C ++包装器的本机(非托管)C ++控制台测试应用程序项目
  4. 我构建了一个基于该模式的测试解决方案,它从zip存档中删除了一个文件,效果很好。但请注意,混合模式DLL是从本机C ++控制台应用程序调用的,该应用程序是VS解决方案的一部分。我没有注册任何DLL,它只是工作。

    但最终我需要ETL工具来调用混合模式DLL。我无法让它发挥作用。

    到目前为止我在ETL服务器上尝试过的事情:

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

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

1 个答案:

答案 0 :(得分:0)

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

  • ETL工具没有找到DLL,但Process Monitor告诉我它正在检查的文件夹...我将DLL移动到其中一个已检查的文件夹
  • 我的包装函数最初是无效的,返回值的输出参数 - 这引起了问题,因为我没有在ETL文档中有关如何调用void函数的好例子。我更改了函数以返回" long"并删除了输出参数。

完成这两项更改后,它开始工作。再次感谢马特!