1

我对 C# 非常陌生,并且在 C++ 和 Java 领域有更多的知识。在编译 C++ 或 Java 项目时,我习惯于单独为每个源文件执行编译。在 C++ 中,随后采取了将所有目标文件链接到一个库/exe/dll 的附加步骤。

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

选项集.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# 库。

4

1 回答 1

7

C# 不支持做你想做的事,源文件 (.cs) 和最终程序集 (.dll 和 .exe) 之间只有一个步骤。

请记住,对于相同数量的源代码,C# 编译器通常C/C++ 编译器快得多(除其他外,这是因为 C# 不必为每个源文件读取兆字节的头文件) ,所以一般编译速度不是问题。

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

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

于 2013-10-04T12:39:41.867 回答