1

私は C# を初めて使用し、C++ と Java の分野でより多くの知識を持っています。C++ または Java プロジェクトをコンパイルするとき、私はコンパイルがソース ファイルごとに個別に実行されることに慣れています。C++ では、すべてのオブジェクト ファイルを 1 つのライブラリ/exe/dll にリンクする追加の手順が後で実行されます。

dmcsこの方法にはいくつかの利点がありますが、monoコンパイラを使用して C# で実現する方法が見つかりません。それぞれ 1 つのクラスを持つ 2 つのファイルがあるとします。

OptionsSet.cs

interface OptionsSet {

    // 

}

DefaultOptionsSet.cs

class DefaultOptionsSet : OptionsSet {

    // 

}

これを呼び出すことで、これをライブラリに正常にコンパイルできます

dmcs mylib/OptionsSet.cs mylib/DefaultOptionsSet.cs -target:library -out:mylib.dll

しかし、1 つのファイルを変更したときに、すべてのソース ファイルを再コンパイルしたくありません。次のことを行います。

dmcs mylib/DefaultOptionsSet.cs -target:library -out:mylib/DefaultOptionsSet.dll

収量

mylib\DefaultOptionsSet.cs(15,27): error CS0246: The type or namespace name `OptionsSet' could not be found. Are you missing an assembly reference?
Compilation failed: 1 error(s), 0 warnings

オプションを使用してアセンブリ参照を追加できることはわかってい-rますが、アセンブリ参照がまだコンパイルされていない場合はどうなりますか?

Java では、私の Makefile は次のようになります。

SOURCE_DIRS = mylib
SOURCES = $(foreach dir,$(SOURCE_DIRS),$(wildcard $(dir)/*.java))
CLASSES = $(SOURCES:java=class)

compile: $(CLASSES)

mylib/%.class: mylib/%.java
    javac $< -classpath .

しかし、これを直接変換して C# ライブラリを構築することはできません。

4

1 に答える 1

7

C# は、やりたいことをサポートしていません。ソース ファイル (.cs) と最終アセンブリ (.dll および .exe) の間には 1 つのステップしかありません。

一般に、C# コンパイラは、同じ量のソース コードに対して C/C++ コンパイラよりもはるかに高速であることに注意してください (とりわけ、これは、C# がソース ファイルごとにメガバイトのヘッダー ファイルを読み取る必要がないためです)。であるため、一般的にコンパイル速度は問題になりません。

本当にできることが必要な場合は、作業をいくつかのアセンブリ (.dll ファイル) に分割し、それぞれを個別にコンパイルしてから、メインの実行可能ファイルをビルドするときにそれらのアセンブリを参照するだけです。ただし、プロジェクトが非常に大きい場合を除き、この分割の実装により多くの時間を費やすことになります。

実際に長いコンパイル時間に問題がない限り、長いコンパイル時間について心配しないことをお勧めします。

于 2013-10-04T12:39:41.867 に答える