web-dev-qa-db-ja.com

.DLLを静的にリンクする方法は?

VSによってビルドされた(純粋なネイティブC++).DLLがあります。クライアントとして、いくつかのネイティブC++アプリケーションと、この周りの.Net-WrapperがありますDLL C++/CLIで記述されています。最後に、C#で記述された.Net-Wrapperのクライアントアプリケーションがいくつかあります。

私の問題は、native.dllは.Netの世界とは異なる方法で配布する必要があり、VSがそのDLLを追跡しないことです。したがって、すべてのC#アプリを正しく機能させるには、それを各実行可能ディレクトリにコピーするか、%PATH%のどこかに置く必要があります(開発者のコ​​ンピューターでは、異なるバージョンのDLLで異なるアプリを起動したい場合があるため、これを避けます)。 Wrapper-DLLを参照するUserControlがある場合は、さらに大きな問題が発生します。DLLをVSのディレクトリにコピーするか、再度%PATH%にコピーする必要があります。ただし、最悪の場合は翻訳ツールで発生します。このツールは.Net-Assembliesを追跡し、それらをTranslator-packagesにパックして、外部トランスレーターに送信できますが、私の知る限り、ネイティブ.DLLをそのパッケージに入れる方法はありません!

したがって、ネイティブDLLを静的に.Net-Wrapperにリンクして、問題を解決します。ただし、ネイティブアプリケーションの場合、このネイティブDLL DLL。

だから私は2つのオプションがあります:

  • その2つのプロジェクトを作成します(静的ライブラリを生成するプロジェクトと、動的ライブラリを作成するプロジェクト=>私はこれを回避しようとします)
  • DLLを静的にリンクするソリューションを見つける
  • VSが1つのプロジェクトから2つの出力を生成する方法を見つける
24
mmmmmmmm

DLLのC++プロジェクトファイルで、2つの構成を作成します。1つはDLLを生成し、もう1つは.libを生成します。NET/ C++プロジェクトはサポートできるため、2つのプロジェクトは必要ありません。複数のビルド構成(これにより、リリースバージョンとデバッグバージョンのビルド方法が異なります)。

7
BmanInHouston

別のオプションは2つのプロジェクトを持つことです。1つのプロジェクトは静的にリンクできる.libを出力し、2つ目のプロジェクトは.dllを出力し、.libを依存関係として持つため、.dllに.defを追加する必要があります。エクスポートする予定のシンボル、またはそうでなければ空になります。

5
Ismael

DLLをLibにコピーします (編集:より安価なオプションが見つからない場合)

4
SmacL

Dllを生成し、dllexportを使用してエントリポイントをlibにエクスポートできます。これについては、ここで説明します

http://msdn.Microsoft.com/en-us/library/3y1sfaz2.aspx

1
kiriloff