2009-04-19 13 views
4

.NETアプリケーションに公開するC++ DLL(コードなし)があります。ネイティブC++ DLLを.NETにラップするDLLの依存関係を追跡する

(COM、P/Invoke、SWIGなど)のすべてのオプションを熟考した後、.NET Class Library(C++/CLI)を作成しています。現在のDLL(クラスライブラリ)には元のDLLとその依存関係も必要です。私の問題は、自動的にそのようなことを追跡することにあります。そのため、ラッパーを使用するアプリケーションは、(元のDLLが新しい依存関係を開発する場合は)他の(ネイティブ)DLLを追跡する必要がありません。

より具体的には(具体的に何かを議論するため)、私はを書きます。 cmrは、PNL,OpenCVなどに依存します。 MRへの参照を(C#)プロジェクトに追加しようとすると、Visual Studio(2005 SP1)でMR.DLLがコピーされ、すべての依存関係が残された後、不明瞭なモジュールが返されました(FileNotFoundException)。手動でcmr,PNLなどをbinディレクトリにコピーして問題を修正しました。

私の質問はこれです.1つのDLLへの参照のみを追加する方法はありますか?すべてはちょうどちょうど動作します

私は...無駄に、SO

EDITグーグルを通して精練してきた:mergebinは私が探しているものに最も近いと思われるが、それは唯一と.NETのDLLをマージすることができますが1つのネイティブDLL。残念ながら、ネイティブDLLをマージすることはできません。あなたは2つの特定の問題を持っているよう

答えて

6

あなたは、mergebinで使用すると、1つのアセンブリに管理されていないと管理のDLLを組み合わせることができるツールを見てかかることがあります。System.Data.SQLiteはこのアプローチを使用します。

0

サウンズ:

  1. ビルドが動的場合に上書きコピーする必要がネイティブコードの依存関係を把握するためにどのよう
  2. を開始する前に、ネイティブコードのDLLをコピーする方法彼らは変わる。

1)では、C#プロジェクトでビルド前のステップを使用して、カスタムファイルを呼び出して正しいファイルをコピーすることができます。

2)はすでにanswered here on Stack Overflowのように見えます。

0

さて、あなたは、単にビルドプロセスの一部として、自動的に正しい出力ディレクトリに必要なDLLをコピーするコマンドを追加することができます。これは、Visual Studioでプロジェクトのプロパティに移動して行います。

プロジェクト - > MyProjectNameプロパティ... - >あなたは$(TargetPathが)に必要なファイルをコピーするためのコマンドを追加し、あなたが行われているイベント

を構築します。 (あなたが唯一のVisual Studio内から、それを実行しているとき)

別のオプションは、あなたが必要とするすべてのDLLが存在するディレクトリであることを単にプロジェクトの現在の作業ディレクトリを設定することです。外部からプログラムを実行するときには、手動でファイルをコピーする必要がありますが、開発が少し楽になります。

2

私は現在、非常によく似た問題を抱えています。

あまりにも私の目標を達成する一つの大きなステップは、これはに書き込むリンカオプション

/ASSEMBLYLINKRESOURCE:"$(OutDir)\Native.dll" 

をC++/CLIのプロジェクトで事前に構築された段階で、出力ディレクトリにネイティブ.DLLをコピーして追加することでした

アセンブリに属する​​ファイル "Native.dll"が存在するアセンブリを生成します。そのプロジェクト/アセンブリを参照するすべてのプロジェクトは、Native.dllもコピーします。 (もしあなたがそこに集まっているなら、それはGACにも行かなければならない - 私はそれをチェックしなかった)。

さて、あなたはまだすべてのnative.dllを追加する必要があります。 非常に異なるパスからAssembly.LoadFrom()を使ってアセンブリをロードすると、実行時にネイティブDLLが見つかるかどうかわかりません(これは、C++/CLIラッパーアセンブリはVisual Studioデザイナによって必要とされます)。

私はこれがあなたの問題に少し役立つことを願っています。

EDIT:

さらなる調査ラッパー.DLLは常にネイティブ.DLLを見つけること...それは良いことだが示されました。悪い点は、フォームを開くときにVisual Studio Designerが必要なアセンブリを一時ディレクトリ(ユーザーディレクトリのどこか)にコピーすることです。アセンブリをコピーすると、リンクされたリソースが無視され、これによってネイティブのDLLが無視されます。

+0

+1これは良い方法です。ネイティブdll名は、マネージdllのマニフェストに埋め込まれています。 DLLはまだ飛んでいるものの、ビルドツール(少なくとも理論上)はネイティブの依存関係を把握できます。 Web配置シナリオでうまく機能します。 – tivadj

関連する問題