我是C#的新手,对C ++和Java领域有更多的了解。在编译C ++或Java项目时,我习惯于为每个源文件自己执行编译。在C ++中,之后将所有目标文件链接到一个库/ exe / dll中的附加步骤。
我在这个方法中看到了几个优点,但我找不到使用单dmcs
编译器在C#中实现它的方法。假设我有两个文件,每个文件都有一个类。
OptionsSet.cs
interface OptionsSet {
//
}
DefaultOptionsSet.cs
class DefaultOptionsSet : OptionsSet {
//
}
我可以通过调用
将其成功编译到库中dmcs mylib/OptionsSet.cs mylib/DefaultOptionsSet.cs -target:library -out:mylib.dll
但是当我更改单个文件时,我不想重新编译所有源文件!执行以下操作:
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#库。
答案 0 :(得分:7)
C#不支持执行您想要执行的操作,源文件(.cs)和最终程序集(.dll和.exe)之间只有一步。
请记住,对于相同数量的源代码,C#编译器通常比C / C ++编译器快很多(除此之外,这是因为C#不需要读取每个源文件的兆字节头文件),因此通常编译速度不是问题。
如果您真的想要做的是将您的工作拆分为多个程序集(.dll文件),请单独编译每个程序集,然后在构建主可执行文件时引用这些程序集。但是,除非您的项目非常大,否则您将花费更多时间来实施此拆分,而不是在完成建设后节省的时间。
我建议不要担心编译时间过长,除非你在编译时遇到问题。