7

これは非常に単純なことの 1 つであり、私が読んだどのチュートリアルでも、誰も出てきてそれを言うことはありません。

私はいくつかのスタンドアロン .NET アプリケーションと、他のプログラム用の DLL ベースのプラグインをいくつか作成してきました。Visual Studio のプロジェクトは、少なくとも Windows アプリケーションとクラス ライブラリを使用して、1 つのファイル (EXE または DLL) にコンパイルされることに気付きました。

これは常に当てはまりますか?大規模なアプリケーションを編成するという点では、Visual Studio のプロジェクトは、最終的なプログラムの 1 つのファイルに対応していると常に考えるべきですか?

4

5 に答える 5

3

各プロジェクトは単一のファイルにコンパイルされます。(Webサイトのプロジェクトを除く)

ただし、プロジェクト内の任意のファイルのビルド アクションを [常にコピー] または [新しい場合はコピー] に設定すると、プロジェクトはそのファイルを出力フォルダーにコピーします。
また、EXE プロジェクトに App.config ファイルがある場合は、それも出力フォルダーにコピーされます。

プロジェクトが、コア フレームワークの一部ではない DLL (自分自身のものか他の誰かのものかを問わず) を参照する場合、その DLL がプロジェクトの出力フォルダーにコピーされ、2 つのファイルが作成されます (ただし、そのうちの 1 つだけに からのコードが含まれます)。プロジェクト自体)

また、DLL と EXE に加えて、Visual Studio は出力フォルダーにデバッグ シンボルを含む .pdb ファイルも作成します。このファイルはデバッガーによって使用されるため、ユーザーに配布しないでください。(コードをデバッグしてもらいたくない場合を除く)

于 2009-12-10T03:48:50.497 に答える
2

複数のモジュールを作成し、テーマを1つのdllにリンクする方法の例:

csc /t:module RarelyUsedTypes.cs
csc /out:AllTypes.dll /t:library /addmodule:RarelyUsedTypes.netmodule AllTypes.cs 

詳細については、C#を介したRichterの本CLRを参照してください。

VisualStudioのこのプロセスを自動化できます。

プロジェクトごとに、ネットモジュールまたはアセンブリを作成し、それらすべてを1つのアセンブリにコンパイル/マージします。

最初の選択肢。これはJayR.Wrenによって提案されまし

これはかわいいハックですが、CSCとVBCの両方が/target:module/addmoduleオプションをサポートしているため、シェルスクリプトまたはファイルを作成するだけで、ILMergeなしで実際にこれを行うことができます。

Visual Studioは「netmodule」タイプをサポートしていませんが、MSBuildはサポートしています。

VBプロジェクトをソリューションに追加します。プロジェクトをアンロードし、プロジェクトファイルを編集します。

OutputTypeをモジュールに変更します。

<OutputType>module</OutputType>

目的のプロジェクトへの参照を追加する代わりに、モジュールを追加します。残念ながら、ここでもVStudioは失敗しますが、MSBUILDは問題なく動作します。プロジェクトをアンロードし、プロジェクトファイルを編集します。AddModulesincludeディレクティブを使用してアイテムグループを追加します。

<ItemGroup><AddModules Include="..\VbXml\bin\Debug\VbXml.netmodule" /></ItemGroup>

/addmoduleこれにより、Studioが管理する参照アイテムグループと同様に、msbuildにディレクティブを使用するようにCSCに指示します。

主な欠点:追加されたモジュールにVisualStudioIntellisenseがありません。すでにリファレンスがありますが、モジュールがないのは残念です。[更新:@ Ark-kunが指摘したように、Visual Studioは.netmoduleプロジェクトを参照し、Intellisenseを使用できます。出力タイプを変更する前に、プロジェクト参照を追加するだけです。]

SharpDevelopには最初のステップがありますが、2番目のステップである「モジュールの追加」GUIは、SD2.0以降優先度の低いアイテムとして開かれています。

2番目の選択肢。このすばらしい記事(Scott Hanselmanによる)では、VisualStudioを使用している場合にアセンブリを自動的に統合する方法について説明しています。最初の選択肢とは異なり、 IntelliSenseをサポートます。

于 2009-12-10T06:59:07.620 に答える
2

単純なプロジェクトの場合、はい、プロジェクトごとに常に 1 つのアセンブリを取得します。ただし、より本番環境に対応したソフトウェアに移行する場合、答えは異なります。DLL を配信したいが、ユーザーに表示する必要があるテキストが含まれているとします。おそらく、そのテキストをローカライズしたいと思うでしょう (英語版とドイツ語版、または米国英語版と英国英語版を提供することもできます [番組と番組を考えてください])。テキストをリソースに配置し、それらのリソースをサテライト アセンブリと呼ばれるものにコンパイルします。サポートすることを選択したロケールごとに 1 つのサテライト アセンブリを取得します。

ここでは、サテライトアセンブリを生成して使用する方法について簡単に説明します。

netmodules と ILMerge について話している人を見かけます。ネットモジュールについて心配している場合は、Microsoft が提供したツールを使用していないため、何か間違ったことをしていると思います (または、Microsoft のツールを使用していない場合、Mono ランドにいます)。私は ILMerge を使用したことがありませんが、それについて読んだ後、私はそれを信頼できるかどうか確信が持てません。 この人は、WPF/XAML コード以外は問題なく動作すると言っています。この人は、ILMerge を実行した後、埋め込みリソースにアクセスできませんでした。この人ILMerge を実行した後、デバッガーを使用してもステップ実行できない最適化されたコードを見ました。これは、ILMerge がすべてのシナリオに対応する本番環境向けのツールではないことを示すのに十分な情報です。ソフトウェアの設計の一部は、それをどのように展開するかを考えることです。少数のアセンブリを展開する場合は、コンパイル後に IL をいじるのではなく、そのようにソフトウェアを設計する必要があります。地図製作者がよく言ったように、「ここにドラゴンがいる」。

于 2009-12-10T04:01:39.663 に答える
1

Visual Studio の場合、はい。インターネットで「netmodule」を検索すると、探しているドキュメントが見つかります。複数のプロジェクトを 1 つの DLL にアセンブルしようとしていたときに、たまたまそれらに出会いました。

MSDN: https://docs.microsoft.com/en-us/dotnet/framework/app-domains/how-to-build-a-multifile-assembly

于 2009-12-10T03:46:19.923 に答える
1

必ずしも。プロジェクトにカルチャ指向のリソースがある場合、それらは通常、個別のアセンブリ (dll) にコンパイルされます。また、ASP.Net プロジェクトは単一のアセンブリにコンパイルされません。常に aspx/ascx ファイルまたはそれらに相当するマーカーがコンパイルされたコードとは別に残されます。

于 2009-12-10T03:50:23.770 に答える