5

.NETアプリケーションに公開したいC++DLL(コードなし)があります。

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

より正確に(そして議論するために具体的な何かを持っている)、私はラップしようとしているので、クラスライブラリ(当然、に依存します)cmrを書きます。、、およびその他に依存します。(C#)プロジェクトに参照を追加しようとすると、Visual Studio(2005 SP1)がコピーし、すべての依存関係を残して、文句を言います(不足しているモジュールについてスローします)。、などをディレクトリに手動でコピーすると、問題が修正されました。MRcmrcmrPNLOpenCVMRMR.DLLFileNotFoundExceptioncmrPNLbin

面倒なことはありませんが、私の質問は次のとおりです。.NETアプリが1つのDLLへの参照のみを追加し、すべてが正常に機能する方法はあります

私はグーグルとSOを精査してきましたが、無駄になりました...

編集:mergebinは私が探しているものに最も近いようですが、.NETDLLを1つのネイティブDLLとのみマージできます。残念ながら、ネイティブDLLをマージすることはできません。

4

4 に答える 4

6

アンマネージ DLL とマネージ DLL を 1 つのアセンブリに結合できるツールであるmergebinをご覧ください。System.Data.SQLiteはこのアプローチを使用します。

于 2009-04-19T08:39:08.043 に答える
3

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

私の目標を達成するための大きなステップの 1 つは、C++/CLI プロジェクトのビルド済みステップによってネイティブ .DLL を出力ディレクトリにコピーし、リンカー オプションを追加することでした。

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

これにより、アセンブリに属する​​ファイル「Native.dll」があることが、結果のアセンブリに書き込まれます。そのプロジェクト/アセンブリを参照するすべてのプロジェクトは、Native.dll もコピーします。(アセンブリをそこに置くと、GACにも入るはずです-私はそれをチェックしませんでした)。

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

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

編集:

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

于 2009-05-08T06:01:38.030 に答える
0

2つの特定の問題があるようです。

  1. ビルドを開始する前にネイティブコードdllをコピーする方法
  2. 変更された場合にコピーする必要があるネイティブコードの依存関係を動的に把握する方法。

1)の場合、C#プロジェクトでビルド前の手順を使用して、カスタムutilを呼び出し、正しいファイルをコピーできます。

2)は、StackOverflowですでに回答されているようです。

于 2009-04-19T06:04:37.633 に答える
0

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

プロジェクト -> MyProjectName プロパティ... -> ビルド イベント

必要なファイルを $(TargetPath) にコピーするコマンドを追加すれば完了です。

もう 1 つのオプションは、プロジェクトの現在の作業ディレクトリ (Visual Studio 内からのみ実行している場合) を、必要なすべての DLL が存在するディレクトリに設定することです。プログラムを外部で実行する場合は、ファイルを手動でコピーする必要がありますが、開発が少し簡単になります。

于 2009-04-19T08:03:20.580 に答える