通过混合模式 C++/CLI DLL 从 ETL 工具使用托管 C# DLL - 可能吗?
Utilizing a Managed C# DLL from an ETL Tool via a Mixed-Mode C++/CLI DLL - Possible?
我正在使用 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 操作的函数。
由于我不知道如何以编程方式操作 zip 文件,我找到了 DotNetZip - 一个免费的 .NET class 库,它为 zip 提供了繁重的工作归档操作。我的问题是它是.NET(托管)。我仍然想尝试使用它。因此,我构建了一个 C# DLL (.NET 4.0),其功能利用 DotNetZip 来执行所需的 zip 文件操作。我传入了两个参数,"zip file location" 和 "file to remove" 并且 zip 存档得到更新。
我了解了构建混合模式 C++/CLI DLL 以利用本地世界中的托管 .NET 代码的想法。我找到了 this VS 解决方案,它由 3 个基本项目组成:
- 托管 (C#) DLL 项目
- 引用 C# DLL 的混合模式 C++ DLL 包装器项目
- 引用 C++ 包装器的本机(非托管)C++ 控制台测试应用程序项目
我基于该模式构建了一个测试解决方案,该模式从 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 一起工作。这可能吗?如果是这样,我错过了什么?
感谢 Matt,感谢您提示使用 Process Monitor。
- ETL 工具没有找到 DLL,但 Process Monitor 告诉我它正在检查的文件夹...我将 DLL 移到了检查的文件夹之一
- 我的包装函数最初是 void,输出参数为 return 值 - 这导致了问题,因为我在 ETL 文档中没有关于如何调用 void 函数的很好的示例。我将函数更改为 return a "long" 并删除了输出参数。
进行这两项更改后,它开始工作了。再次感谢马特!
我正在使用 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 操作的函数。
由于我不知道如何以编程方式操作 zip 文件,我找到了 DotNetZip - 一个免费的 .NET class 库,它为 zip 提供了繁重的工作归档操作。我的问题是它是.NET(托管)。我仍然想尝试使用它。因此,我构建了一个 C# DLL (.NET 4.0),其功能利用 DotNetZip 来执行所需的 zip 文件操作。我传入了两个参数,"zip file location" 和 "file to remove" 并且 zip 存档得到更新。
我了解了构建混合模式 C++/CLI DLL 以利用本地世界中的托管 .NET 代码的想法。我找到了 this VS 解决方案,它由 3 个基本项目组成:
- 托管 (C#) DLL 项目
- 引用 C# DLL 的混合模式 C++ DLL 包装器项目
- 引用 C++ 包装器的本机(非托管)C++ 控制台测试应用程序项目
我基于该模式构建了一个测试解决方案,该模式从 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 一起工作。这可能吗?如果是这样,我错过了什么?
感谢 Matt,感谢您提示使用 Process Monitor。
- ETL 工具没有找到 DLL,但 Process Monitor 告诉我它正在检查的文件夹...我将 DLL 移到了检查的文件夹之一
- 我的包装函数最初是 void,输出参数为 return 值 - 这导致了问题,因为我在 ETL 文档中没有关于如何调用 void 函数的很好的示例。我将函数更改为 return a "long" 并删除了输出参数。
进行这两项更改后,它开始工作了。再次感谢马特!