是否可以使用.net核心Roslyn编译器编译单个C#代码文件?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (190)

在旧的.net中,我们曾经能够运行csc编译器来编译单个cs文件或多个文件。使用.net核心,我们dotnet build坚持拥有一个合适的项目文件。是否有独立的命令行编译器,它允许编译源代码文件而无需项目(并在同一命令行上列出引用的依赖项)?

在Linux上,当我安装了旧的csc和新的.net核心时,我得到了这些时间:

[root@li1742-80 test]# time dotnet build
Microsoft (R) Build Engine version 15.3.409.57025 for .NET Core
Copyright (C) Microsoft Corporation. All rights reserved.

  test -> /root/test/bin/Debug/netcoreapp2.0/test.dll

Build succeeded.
    0 Warning(s)
    0 Error(s)

Time Elapsed 00:00:03.94

real    0m7.027s
user    0m5.714s
sys     0m0.838s

[root@li1742-80 test]# time csc Program.cs
Microsoft (R) Visual C# Compiler version 2.3.0.61801 (3722bb71)
Copyright (C) Microsoft Corporation. All rights reserved.


real    0m0.613s
user    0m0.522s
sys     0m0.071s
[root@li1742-80 test]#

使用.net核心注意7秒,使用旧csc注意几百毫秒Program.cs

我希望能够使用.net核心快速编译,因为我曾经能够使用csc。

提问于
用户回答回答于

可以使用直接调用编译器

$ /usr/local/share/dotnet/sdk/2.0.0/Roslyn/RunCsc.sh

但是,如果没有支持项目基础结构,则此特定命令可能无效,因为您需要手动传入所有.NET Core或.NET Standard引用程序集,这通常由SDK和NuGet处理。你会得到这样的错误:

$ /usr/local/share/dotnet/sdk/2.0.0/Roslyn/RunCsc.sh Program.cs
Microsoft (R) Visual C# Compiler version 2.3.2.61921 (ad0efbb6)
Copyright (C) Microsoft Corporation. All rights reserved.

Program.cs(1,7): error CS0246: The type or namespace name 'System' could not be found (are you missing a using directive or an assembly reference?)
Program.cs(5,11): error CS0518: Predefined type 'System.Object' is not defined or imported
Program.cs(7,26): error CS0518: Predefined type 'System.String' is not defined or imported
Program.cs(7,16): error CS0518: Predefined type 'System.Void' is not defined or imported
用户回答回答于

简而言之,没有预定义的项目就不支持它。

但是@ Andrew的评论显示,如果您准备好列出每个单独的依赖项,包括命令行选项中的隐式系统依赖项,它仍然是可能的。

错误CS0518:未定义或导入预定义类型'System.Object'#12393

目前,我们还没有计划以这种方式轻松使用csc.exe。该指南暂时使用dotnet CLI工具。即使在这里做了一些修改,也会在框架上为编译器提供统一的和/或简化的引用程序集。编译器永远不会有比现在更复杂的类型或程序集分辨率(按设计)。

另请参见closed 可以直接调用编译器#7689

扫码关注云+社区

领取腾讯云代金券