代码之家  ›  专栏  ›  技术社区  ›  C. Suttle

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

  •  0
  • C. Suttle  · 技术社区  · 7 年前

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

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

    我基于该模式构建了一个测试解决方案,它从zip存档中删除一个文件,效果非常好。但是,请注意,混合模式DLL是从作为VS解决方案一部分的本机C++控制台应用程序调用的。我不需要注册任何DLL,它可以正常工作。

    然而,最终我需要ETL工具来调用混合模式DLL。我没办法让它工作。

    • 我试图注册混合模式包装器DLL,但SysWow64\regsvr32在DLL中找不到入口点。
    • 我在ETL服务器上安装了VS2015 VC++x86和x64可再发行库。

    ETL工具具有调用外部应用程序的能力,因此我相信我可以让它调用类似于我的VS测试解决方案的控制台应用程序,但我真的希望它只使用DLL。这可能吗?如果是,我缺少什么?

    1 回复  |  直到 7 年前
        1
  •  0
  •   C. Suttle    7 年前

    感谢Matt,感谢您提示使用过程监视器。

    • ETL工具找不到DLL,但Process Monitor告诉我它正在检查的文件夹…我将DLL移到其中一个已检查的文件夹
    • 我的包装器函数最初是空的,返回值有一个输出参数-这导致了问题,因为我在ETL文档中没有一个关于如何调用空函数的好例子。我将函数更改为返回“long”,并删除了输出参数。

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