通过使用“对象”文件更快地进行C#编译并在以后合并?

时间:2013-10-04 12:32:16

标签: c# .net compilation mono assembly-references

我是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#库。

1 个答案:

答案 0 :(得分:7)

C#不支持执行您想要执行的操作,源文件(.cs)和最终程序集(.dll和.exe)之间只有一步。

请记住,对于相同数量的源代码,C#编译器通常比C / C ++编译器快很多(除此之外,这是因为C#不需要读取每个源文件的兆字节头文件),因此通常编译速度不是问题。

如果您真的想要做的是将您的工作拆分为多个程序集(.dll文件),请单独编译每个程序集,然后在构建主可执行文件时引用这些程序集。但是,除非您的项目非常大,否则您将花费​​更多时间来实施此拆分,而不是在完成建设后节省的时间。

我建议不要担心编译时间过长,除非你在编译时遇到问题。