2016-11-15 30 views
0

我正在使用32位ETL工具(Pervasive Data Integrator v9)。我需要賦予這個工具調用外部函數的能力,該函數將從ZIP壓縮文件中刪除文件,而不用提取壓縮文件。通過混合模式C++/CLI DLL使用來自ETL工具的託管C#DLL - 可能嗎?

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類庫,爲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是從本地C++控制檯應用程序調用的,該應用程序是VS解決方案的一部分。我沒有註冊任何DLL,它只是工作。

但是最終我需要ETL工具來調用混合模式DLL。我無法得到這個工作。

事情我必須在ETL服務器上迄今爲止嘗試:

  • 我試圖註冊混合模式包裝DLL但SYSWOW64 \ REGSVR32無法在DLL中找到一個切入點。
  • 我在ETL服務器上安裝了VS 2015 VC++ x86和x64可再發行組件庫。
  • 我在ETL引擎文件夾中放置了我的解決方案中的DLL(即混合模式,c#和dotnetzip dll),因爲控制檯應用程序在DLL位於其deploy文件夾中時工作。

的ETL工具必須調用外部應用程序的能力,所以我相信我會讓它調用類似我VS測試解決方案控制檯應用程序,但我真的很想得到這個只用DLL的工作。這可能嗎?如果是這樣,我錯過了什麼?

+0

由於混合DLL不是COM DLL,因此不需要運行regsvr32。除了C++運行時,你是否在目標機器上安裝了.NET?你所有的DLL是32位的嗎? – Matt

+0

謝謝Matt,在目標機器上安裝了.NET,我驗證4.0存在。我可能在這裏顯示我的無知,但我相信這些DLL都是32位的。控制檯應用程序和混合模式DLL項目的目標平臺是Win32。 C#DLL的目標平臺是Any CPU。不知道如何判斷他們是否是32位? –

+0

目標機器是Windows Server 2012 R2 Datacenter –

回答

0

馬特的榮譽,感謝您使用Process Monitor的提示。

  • ETL工具是沒有找到DLL,但進程監視器告訴我這是檢查文件夾...我感動的DLL文件到選中的文件夾中的一個
  • 我的包裝功能原本與輸出參數無效返回值 - 這是導致問題的原因,因爲我在ETL文檔中沒有很好的示例來介紹如何調用void函數。我改變了函數返回一個「長」,並刪除了輸出參數。

做出這兩個更改後,它開始工作。再次感謝馬特!