2013-10-04 32 views
1

我對C#很陌生,在C++和Java領域有更多的知識。編譯一個C++或Java項目時,我習慣於爲每個源文件自行編譯。在C++中,後續將所有目標文件鏈接到一個庫/ exe/dll中。通過使用「對象」文件並稍後合併更快的C#編譯?

我看到這種方法的幾個優點,但我找不到一種方法來實現它在C#中使用單聲道dmcs編譯器。假設我有兩個文件,每個文件只有一個類。

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

爲什麼不製作dll? – Sadique

+1

@Acme我不是用上面的命令製作DLL文件嗎? ('-target:library') –

+0

相關:[如何可以讓某人像Java一樣使用ac#增量編譯器?](http://stackoverflow.com/questions/5502440/how-could-someone-make-ac-sharp-incremental -compiler-like-java) – sloth

回答

6

C#不支持做你想做的事,源文件(.cs)和最終的程序集(.dll和.exe)之間只有一個步驟。

請記住,C#編譯器一般是很多快於C/C++編譯器對於相同數量的源代碼(除此之外,這是因爲C#不必讀取兆字節的頭文件每個源文件的文件),所以通常編譯速度不是問題。

如果你真的想要你可以做的是將你的工作分成幾個程序集(.dll文件),分別編譯每一個,然後在構建主要可執行文件時引用這些程序集。然而,除非你的項目真的很大,否則你會花更多的時間來實現這個分裂,而不是在完成時減少構建的時間。

我建議不要擔心編譯時間過長,除非您實際上遇到了編譯時間過長的問題。

+0

感謝您的解釋。現在你說了,編譯真的不需要太長時間。 :) –