2011-07-25 22 views
0

私はunamanged DLL(元はCコードから構築されています)を継承し、.NETプロジェクト。私はDLLの機能をC++型オブジェクトにラップするヘッダファイルを持っています。このオブジェクト指向の機能を公開したいのです。これらのヘッダファイルを標準のC++(Win32)プロジェクトとC++/CLIプロジェクトに#includeして元のDLLを参照すると、すべてうまく動作します。CLI/C++ DLLがアンマネージDLLをラップして実行時にクラッシュしました。(ieshims.dllとgpsvc.dllがありません)

Visual C++ Express 2010を使用して、.NETの管理DLLを構築しようとしました。このDLLは、依存関係の問題のため実行時にクラッシュしました。依存性ウォーカーは言う:

警告:少なくとも1つの遅延負荷依存モジュールが見つかりませんでした。

警告:遅延ロード依存モジュールのエクスポート機能がないため、少なくとも1つのモジュールにインポートされていないインポートがあります。

gpsvc.dllまたはieshims.dllが見つからないと不平を言う。私はこれがx64との関係があることを知っています(私はx64上でWin7を実行しています)が、私のシステム上でDLLをC++プロジェクトで使用できるので、管理DLLでこれを使って同じシステム上の.NETで。

どのような洞察力も提供できる人には、本当にありがとうございます!

(私の目標は、元のDLLでp/invokeを直接使用するのではなく、.NETアセンブリを開発することです。これは、後に限定された相互運用性を持つ多くのC#/ VBプログラマによって使用されるためです)

+0

「プラットフォームターゲット」に関する.NETプロジェクトの設定は何ですか? C#プロジェクト設定の「ビルド」タブを参照してください。 C++ DLLが32ビット用に構築されており、64ビットプラットフォームで実行する場合、「プラットフォームターゲット」は「x86」である必要があります。しかし、これはあなたが観察している問題とは無関係です。 – Manfred

+0

プラットフォームターゲット - x86、安全でないコードが許可されていないことを許可し、最適化コードがチェックされています。ありがとう – Rory

+0

依存性ウォーカーの32ビット版を使用していることを確認してください。このツールは、32ビットの実行可能ファイルが見つかると、32ビットのライブラリ検索ルールを使用するほどスマートではありません。 –

答えて

0

解決方法:x86/x64の問題は赤ん坊です。私は3-dllの長い依存関係を持っていました。すべての参照のVisual Studioの 'コピーローカル'プロパティはtrueに設定されていたため、参照していた管理対象のDLLは、依存関係からローカルにコピーされました。

なんらかの理由で、参照のコピーローカルプロパティをfalseに設定し、作成したローカルコピーを削除しても問題が解決されないことがわかりません。私は依存関係をC#プロジェクトのローカルビンにコピーしなければなりませんでした。あなたの答えで述べたあなたのよう

可能性の持ち帰りは、依存関係ウォーカーで不在コール時間依存性にあまり注意を払ってすることは間違った方向にあなたを導くかもしれないということです。..

0

、ロリー、解決策があると思われますC#アプリケーションの参照セクションにすべての従属DLLを含める必要がある、またはC#binまたは.exeが実行されている同じフォルダにすべてのDLLを手動で含める必要があります。

私はちょうどあなたと同様のセットアップでこの問題に遭遇しました。私は(1)CLIのDLLが含まれ、参考文献セクションで

C# application -> (1) CLI Wrapper DLL -> (2) C++ Wrapper DLL -> (3) 3rd Party DLL

:私は、次の依存関係を持っています。私はエラーがERROR ...could not be added. Please make sure that the file is accessible, and that it is a valid assembly or COM component(解釈:C++ DLLは.NET/CLRに準拠していません)をスローするので、(2)C++ DLLを含めませんでした。私は、単に(1)CLI DLLが正しく成功した(2)C++ DLL(私はC++/CLIコンソールアプリケーションでこれをテストした)、にリンクされているので、C#アプリケーションのことができるようになることを想定

referenced(1)CLI依存関係を介して(2)C++依存関係にアクセスします。これは間違っていた。

理由はわかりませんが、C#アプリケーションはCLIの依存関係にアクセスできません。

私の解決策は手動で.exeのディレクトリに(2)C++ DLLが含まれていました。 C#アプリケーションでLocal Copyがtrueに設定されている場合は、(1)CLI DLLが自動的にコピーされることに注意してください。私は(3)サードパーティのDLLを参照している(2)C++ DLL(3)サードパーティDLLが指定されたパスに存在する可能性があり、ローカルにコピーする必要はありませんでした。

関連する問題