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

Nik*_*s R 1 .net c# mono compilation assembly-references

我是C#的新手,对C++和Java领域有更多的了解.在编译C++或Java项目时,我习惯于为每个源文件自己执行编译.在C++中,然后将所有目标文件链接到一个库/ exe/dll中的附加步骤.

我在这个方法中看到了几个优点,但是我找不到使用单声道dmcs编译器在C#中实现它的方法.假设我有两个文件,每个文件都有一个类.

OptionsSet.cs

interface OptionsSet {

    // 

}
Run Code Online (Sandbox Code Playgroud)

DefaultOptionsSet.cs

class DefaultOptionsSet : OptionsSet {

    // 

}
Run Code Online (Sandbox Code Playgroud)

我可以通过调用将其成功编译到库中

dmcs mylib/OptionsSet.cs mylib/DefaultOptionsSet.cs -target:library -out:mylib.dll
Run Code Online (Sandbox Code Playgroud)

但是当我更改单个文件时,我不想重新编译所有源文件!执行以下操作:

dmcs mylib/DefaultOptionsSet.cs -target:library -out:mylib/DefaultOptionsSet.dll
Run Code Online (Sandbox Code Playgroud)

产量

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
Run Code Online (Sandbox Code Playgroud)

我知道我可以使用该-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 .
Run Code Online (Sandbox Code Playgroud)

但我不能直接翻译它来构建我的C#库.

Rol*_*nge 7

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

心里有一个C#编译器是一般很多比C/C++编译器同样多的源代码快(除其他事项外,这是因为C#没有阅读的头文件兆字节为每个源文件) ,所以一般编译速度不是问题.

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

我建议不要担心编译时间过长,除非你确实遇到编译时间过长的问题.