2008-09-02 12 views
16

私はCMSのモジュールで作業しています。このモジュールは、クラスライブラリDLLとして配布されます。Cで静的にリンクする#

私はこのモジュールで使用したいいくつかのユーティリティライブラリを用意しています。とにかく私はこれらのライブラリを静的にリンクすることができるので、いくつかのDLLを配布する必要はありません(それによって私のユーティリティライブラリを別々に配布します)。

私は1つのDLLしか持っていません。

答えて

23

あなたはILMERGEであなたの多くのDLLをマージすることができます:http://research.microsoft.com/~mbarnett/ILMerge.aspx

は自分自身を試していません。それが役に立てば幸い。


ここでダウンロード:
http://www.microsoft.com/downloads/details.aspx?familyid=22914587-B4AD-4EAE-87CF-B14AE6A939B0&displaylang=en

(ダウンロードページから)簡単な説明
ILMergeは、単一の.NETアセンブリに複数の.NETアセンブリをマージするためのユーティリティです。実行可能ファイルとDLLの両方で動作し、出力の処理とフォーマットを制御するためのいくつかのオプションが用意されています。詳細については付属のマニュアルを参照してください。あなたがILMergeを使用しない場合

+1

SebはILMERGEがこれを行うと述べていますが、危険なコードを含むアセンブリはありません。 –

+5

安全でないコードは問題ありません。混合モードアセンブリは扱いません。管理されていないコードを含み、C++/CLIプロジェクトによって作成された種類。 –

2

これは短い答えです。 コンパイル中にdllにリンクすることはできません。 これを行うための微妙な方法があるかどうかはわかりませんが、おそらくdllとcmsを一緒に配布する必要があります。 これを行う最善の方法は、何らかの再配布可能なものを作ることです。

+0

カガマルの答えを見てください。また、Mike Barnettのコメントのコメント欄も見てください。 – Kobor42

+2

@ Kobor42:間違っています、これはマージしているリンクではありません。最も声高にされた答えが質問の意図に答える(それによって最も有用な答えですが)、khebbieの答えは実際に正しい答えです。あなたはC/C++でdllをリンクすることはできません。そのためには静的なアーカイブが必要です。 –

+0

技術的に正しいこの答えにはアップボールがありません。 C#は管理された言語であり、ILMergeもリンカーではなくアセンブリの合併です。 C++およびC開発者が理解しているように、リンカは現在.NETには存在しません。しかし、2015年中頃にはまだリリースされていない ".Netネイティブ"テクノロジは、いつも完全にコンパイルされた(MSILはもう使えない)アプリケーションを可能にし、静的にリンクされる可能性があります。 –

12

、このページを参照してください。

http://blogs.msdn.com/b/microsoft_press/archive/2010/02/03/jeffrey-richter-excerpt-2-from-clr-via-c-third-edition.aspx

編集者注:ジェフリー・リヒターのアドバイスは、各DLLファイルのための資源としてのexeファイル(にあなたのDLLを置きますそのプロパティを表示し、その "Build Action"を "Embedded Resource"に変更します。)。その後、実行可能にするためにカスタムクラスローダが必要になります()。実行時に、CLRは依存DLLアセンブリを見つけることができません。これを修正するには、アプリケーションを初期化するときに、 AppDomainのResolveAssemblyイベント)。

実際のリソースを指すようにresourceName文字列を変更してください。 (たとえば、プロジェクト名にAssemblyLoadingAndReflectionを変更してください)

+1

とても良い!サードパーティのツールを介してNativソリューション。 ILMergeの作成者のコメントセクションを見てください... – Kobor42

+2

これは少し余計な努力を要しますが、これは受け入れられた答えより良い解決策のようです。 – CubicleSoft

関連する問題