6

「通常のユーザー」バージョンと「プロ」バージョンの 2 つのバージョンで、マネージ コード (主に C++/CLI) でツールを構築しています。

コア コードが 2 つのバージョン間で同一であるという事実は、結果のツールを単一のアセンブリ (DLL) としてパッケージ化する必要があり、共通の .cpp ファイルを含める必要がないため、少し問題を引き起こしました。ツールの 2 つのバージョンのプロジェクトのコード。共通コード用のプロジェクトとツールの各バージョン用のプロジェクトを用意し、ツール プロジェクトの各バージョンを共通コードに依存させ、必要に応じてリンクさせたいと思います。

アンマネージ C++ では、共通コードを静的ライブラリに配置し、ツールの両方のバージョンをそれにリンクすることでこれを行います。これを C++/CLI で動作させることができないようです。共通コードを DLL アセンブリにビルドすることを余儀なくされているようで、その結果、必要以上の DLL が作成されます。

要するに、1 つのプロジェクトで共通コードをビルドし、それを各最終製品プロジェクトにリンクして、共通コードを含む 2 つの 1 つの DLL アセンブリを生成する方法がわかりません。

私はおそらく何か間違ったことをしているのですが、ネットモジュールなどを使ってこれを行う方法を考え出そうとしましたが、うまくいきませんでした。最終的に、私がそれを機能させる唯一の方法は、機能する結果ではなく、共通コードアセンブリのビルド製品をリンクするようにリンカに指示することでしたが、私見のハックです。

とにかく、この問題をどのように解決すべきかについて誰か提案がありますか?

編集済み:生成されたアセンブリは 100% マネージド コードではなく、おそらく C++/CLI で生成されたアセンブリによく見られるように、マネージド コードとアンマネージド コードが混在しているという事実に言及すべきだったと思います...

4

7 に答える 7

6

すべてのDLLに悩まされている場合は、ILMergeをダウンロードしてください。これを使用して、複数のDLLをクライアント用の使いやすい.EXEにバンドルします。

于 2009-10-02T08:55:18.663 に答える
3

私がこれを正しく理解していれば、2 つのプロジェクトを含むソリューションがあります。「通常」ユーザー用の 1 つのプロジェクトと「プロ」ユーザー用の 1 つのプロジェクト。Visual Studio では、別のプロジェクトから別のファイル ソースへの "リンク" を追加できます。「pro」バージョンに実際のコア コード ファイルがあり、「通常」バージョンに既存のものを追加する場合 -> 「pro」プロジェクトでファイルを見つけ、[追加] ボタンの横にある下向き矢印をクリックし、[リンクとして追加] を選択します。 "。これで、2 つのプロジェクト間で文字通り同じファイルが 1 つできました。

于 2009-11-12T04:17:38.437 に答える
2

述べたように、ILmergeは1つの方法です。個人的には、いくつかのexeファイルを多数のDLLとバンドルしている場合は、Netzを使用します。

于 2009-10-02T09:00:29.233 に答える
1

モジュールを使用できます。アセンブリ リンカーを使用して、それらをアセンブリにリンクできますal.exe

于 2009-10-02T09:10:39.400 に答える
0

Remotesoftサラマンダーはあなたをフックします。これは基本的にネイティブのコンパイラとリンカです。

于 2009-10-02T08:58:55.553 に答える
0

monoを使用する場合(またはcygwinがオプション)、mkbundleも有効な選択である可能性があります。

于 2009-10-02T09:04:38.867 に答える
0

これは .Net コンパイル プロセスの欠点です。静的ライブラリやそれらをまとめて保持するヘッダー ファイルなどを保持することはできません。すべてが 1 つの大きな dll ファイルに保持され、情報を共有する唯一の方法は、共通の dll をビルドすることです。他のアセンブリから参照するか、各 dll のコードを複製します (おそらく、プロジェクト間で .cs ファイルをコピー/リンクすることによって)。

2 番目の方法では、同じ名前であっても、異なる型を宣言することに注意してください。これは、リモーティング (またはプロセス間の特定の共有インターフェースへのキャストを必要とするもの) のようなものであなたを苦しめます。

于 2009-10-02T08:49:53.403 に答える