2016-11-15 11 views
0

私は32ビットETLツール(Pervasive Data Integrator v9)で作業しています。私はこのツールに、アーカイブを解凍せずにZIPアーカイブ内のファイルを削除する外部関数を呼び出す機能を与える必要があります。混合モードC++/CLI DLLを介したETLツールからのマネージドC#DLLの利用 - 可能ですか?

ETLツールを使用すると、外部DLLを読み込んでその関数を呼び出すことができます。 DLLとその機能は次のようにETLツールのカスタムスクリプト言語で参照されます:(この例ではOemToCharA)

Declare function OemToCharA lib "user32" (byval lpszSrc as string, byval lpszDst as string) as long 

機能、その宣言に続くスクリプトの行のどこかに呼ばれています。私はこれを登録されたDLLでテストしています。

私はzip操作を行う関数を持つDLLをビルドしたいと思います。

zipファイルをプログラム的に操作する方法がわからないので、私はDotNetZipを見つけました。無料の.NETクラスライブラリで、zipアーカイブ操作の負荷が大きくなります。私の問題は、それが.NET(管理対象)であることです。私はまだそれを使用しようとしたいと思います。だから、DotNetZipを利用して必要なzipファイル操作を行う関数でC#DLL(.NET 4.0)を構築しました。私は2つのパラメータ、 "zipファイルの場所"と "削除するファイル"を渡し、zipアーカイブが更新されます。

ネイティブワールドで管理された.NETコードを利用するために、混合モードのC++/CLI DLLを構築するというアイデアを読んだ。

    C#DLLを参照する
  1. マネージド(C#の)DLLプロジェクト
  2. 混合モードのC++ DLLラッパープロジェクト
  3. ネイティブ(アンマネージド)C++コンソールテスト:私は3つの基本的なプロジェクトで構成されていthis VSの解決策を見つけましたC++ラッパーを参照するappプロジェクト

私はzipアーカイブからファイルを削除するそのパターンに基づいてテストソリューションを構築しました。ただし、混合モードDLLはVSソリューションの一部であるネイティブC++コンソールアプリケーションから呼び出されます。私はDLLを登録する必要はありませんでしたし、それだけで動作します。

しかし、最終的には、ETLツールを使用して混合モードDLLを呼び出す必要があります。私はこれを動作させることができません。私はこれまでのETLサーバ上で試してみました

もの:

  • 私は混合モードのラッパーDLLを登録しようとしたが、SYSWOW64の\ます。regsvr32は、DLLのエントリポイントを見つけることができません。
  • ETLサーバーにVS 2015 VC++ x86およびx64再配布可能ライブラリをインストールしました。
  • DLLが展開フォルダにあるときにコンソールアプリケーションが機能したため、私の解決策(つまり、混合モード、c#およびdotnetzip dll)からDLLをETLエンジンフォルダに配置しました。

ETLツールでは外部アプリケーションを呼び出すことができるため、VSテストソリューションに似たコンソールアプリケーションを呼び出せるようになると思いますが、これはDLLのみで動作するようにしたいと思っています。これは可能ですか?もしそうなら、私は何が欠けていますか?

+0

混合DLLはCOM DLLではないため、regsvr32を実行する必要はありません。 C++ランタイムの他に、ターゲットマシンに.NETをインストールしますか?すべてのDLLは32ビットですか? – Matt

+0

ありがとうございましたMatt、はい.NETがターゲットマシンにインストールされていますが、4.0が存在することを確認しました。私はおそらくここに私の無知を示​​しているが、私はDLLがすべて32ビットだと思う。コンソールアプリケーションと混在モードのDLLプロジェクトのターゲットプラットフォームはWin32です。 C#DLLのターゲットプラットフォームは任意のCPUです。彼らが32ビットであるかどうかを他にどのように伝えるべきかわからないのですか? –

+0

ターゲットマシンはWindows Server 2012 R2 Datacenter –

答えて

0

敬具、プロセスモニターを使用するヒントのおかげで、マット。

  • ETLツールは、DLLを見つけることはなかったが、プロセスモニタは
  • 私のラッパー関数は、出力パラメータの持つ本来は無効だった私がチェックしたフォルダのいずれかにDLLを移動...私にそれをチェックしていたフォルダに語りました戻り値 - 問題を引き起こしていたので、void関数を呼び出す方法のETLドキュメントには良い例はありませんでした。私は関数を "long"を返すように変更し、出力パラメータを削除しました。

これら2つの変更を行った後、動作を開始しました。もう一度ありがとうMatt!

関連する問題