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

安德鲁·萨维尼赫(Andrew Savinykh):

在旧的.NET中,我们曾经能够运行csc编译器来编译单个.cs文件或多个文件。

使用.NET Core,我们dotnet build坚持要拥有适当的项目文件。是否有一个独立的命令行编译器可以在没有项目的情况下编译源代码文件(并且在同一命令行中列出了引用的依赖项)?

在Linux上,当我csc同时安装新旧.NET Core时,会得到以下计时:

[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]#

注7秒.NET核心与几百毫秒与旧csc相同的文件,Program.cs

我希望能够使用.NET Core像以前一样快速地进行编译csc

Jacek Blaszczynski:

是的,可以使用.NET Core中的csc或vbc编译器来编译单个文件。

要直接调用Roslyn编译器,必须使用命令行驱动程序csc。{exe | dll},并且与旧的csc.exe相比,Roslyn不会隐式引用mscorlib.dll,因此有必要将引用传递给必需的文件。依赖关系,即System.RuntimeSystem.Private.CoreLib库以及任何其他所需的参照。以下清单显示了如何编译以下Hello,World!程序。

using System;

namespace HelloWorld
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello, World!");
        }
    }
}

在安装了Ubuntu 16.04(Xenial Xerus)和dotnet-sdk-2.0.0的情况下使用WSL

time dotnet /usr/share/dotnet/sdk/2.0.0/Roslyn/csc.exe -r:/usr/share/dotnet/shared/Microsoft.NETCore.App/2.0.0/System.Private.CoreLib.dll -r:/usr/share/dotnet/shared/Microsoft.NETCore.App/2.0.0/System.Console.dll -r:/usr/share/dotnet/shared/Microsoft.NETCore.App/2.0.0/System.Runtime.dll HelloWorld.cs
Microsoft (R) Visual C# Compiler version 2.3.2.61921 (ad0efbb6)
Copyright (C) Microsoft Corporation. All rights reserved.

real    0m0.890s
user    0m0.641s
sys     0m0.250s

ls -li
total 4
 4785074604720852 -rw-rw-rw- 1 developer developer  178 Dec  7 15:07 HelloWorld.cs
11821949022487213 -rw-rw-rw- 1 developer developer 4096 Dec  7 15:13 HelloWorld.exe

在不同的平台上,传递给编译器的必需依赖项是不同的,即,在Windows上就足以传递System.Runtime.dllSystem.Console.dll而在Ubuntu 16.04上还必须附加传递System.Private.CoreLib.dll不同版本的SDK将在不同的位置放置Roslyn和命令行驱动程序-版本之间的SDK布局有所不同-并且最新的2.2.2 SDK附带了csc.dllvbc.dll而不是csc.exevbc.exe因此,在使用此方法之前,有必要检查您的SDK布局。

详细说明

Roslyn编译器的设计方式与以前使用的csc.exevbc.exe编译器略有不同首先,Roslyn用C#和VB.NET编写,是一个托管的.NET应用程序。在Windows上,它主要用作在服务器进程VBCSCompiler.exe(.dll)中运行的常见服务但是,Roslyn附带了托管的命令行驱动程序,csc.exe并且vbc.exe(最新的.NET SDK版本附带了csc.dllvbc.dll)可以用于直接从命令行编译源文件。无论如何,这正是.NET中的构建系统所做的事情,它是通过命令行调用Roslyn的。运行一个简单的dotnet csc.exe -help命令将打印用法信息,这些信息将直接从命令行指导使用编译器(请参阅最后一个清单)。

旧的本机编译器与Roslyn之间的主要区别在于,后者是托管应用程序,这是启动时间。即使在被编译为R2R本机程序集(Ready To Run之后,Roslyn 仍需要从加载整个.NET框架开始,对其进行初始化,然后再加载Roslyn程序集并开始编译过程。但是,它总是比运行本机编译器要慢一些,但是,从上述时间来看,并没有慢很多。

corefx存储库中添加了一个新的文档文章,描述了高级场景-使用csc / vbc和CoreRun构建和运行应用程序代码任何有兴趣的人都可以将其用作如何在.NET Core的较低级别上工作的指南。

    Microsoft (R) Visual C# Compiler version 2.3.2.61921 (ad0efbb6)
Copyright (C) Microsoft Corporation. All rights reserved.


                              Visual C# Compiler Options

                        - OUTPUT FILES -
 /out:<file>                   Specify output file name (default: base name of
                               file with main class or first file)
 /target:exe                   Build a console executable (default) (Short
                               form: /t:exe)
 /target:winexe                Build a Windows executable (Short form:
                               /t:winexe)
 /target:library               Build a library (Short form: /t:library)
 /target:module                Build a module that can be added to another
                               assembly (Short form: /t:module)
 /target:appcontainerexe       Build an Appcontainer executable (Short form:
                               /t:appcontainerexe)
 /target:winmdobj              Build a Windows Runtime intermediate file that
                               is consumed by WinMDExp (Short form: /t:winmdobj)
 /doc:<file>                   XML Documentation file to generate
 /refout:<file>                Reference assembly output to generate
 /platform:<string>            Limit which platforms this code can run on: x86,
                               Itanium, x64, arm, anycpu32bitpreferred, or
                               anycpu. The default is anycpu.

                        - INPUT FILES -
 /recurse:<wildcard>           Include all files in the current directory and
                               subdirectories according to the wildcard
                               specifications
 /reference:<alias>=<file>     Reference metadata from the specified assembly
                               file using the given alias (Short form: /r)
 /reference:<file list>        Reference metadata from the specified assembly
                               files (Short form: /r)
 /addmodule:<file list>        Link the specified modules into this assembly
 /link:<file list>             Embed metadata from the specified interop
                               assembly files (Short form: /l)
 /analyzer:<file list>         Run the analyzers from this assembly
                               (Short form: /a)
 /additionalfile:<file list>   Additional files that don't directly affect code
                               generation but may be used by analyzers for producing
                               errors or warnings.
 /embed                        Embed all source files in the PDB.
 /embed:<file list>            Embed specific files in the PDB

                        - RESOURCES -
 /win32res:<file>              Specify a Win32 resource file (.res)
 /win32icon:<file>             Use this icon for the output
 /win32manifest:<file>         Specify a Win32 manifest file (.xml)
 /nowin32manifest              Do not include the default Win32 manifest
 /resource:<resinfo>           Embed the specified resource (Short form: /res)
 /linkresource:<resinfo>       Link the specified resource to this assembly
                               (Short form: /linkres) Where the resinfo format
                               is <file>[,<string name>[,public|private]]

                        - CODE GENERATION -
 /debug[+|-]                   Emit debugging information
 /debug:{full|pdbonly|portable|embedded}
                               Specify debugging type ('full' is default,
                               'portable' is a cross-platform format,
                               'embedded' is a cross-platform format embedded into
                               the target .dll or .exe)
 /optimize[+|-]                Enable optimizations (Short form: /o)
 /deterministic                Produce a deterministic assembly
                               (including module version GUID and timestamp)
 /refonly                      Produce a reference assembly in place of the main output
 /instrument:TestCoverage      Produce an assembly instrumented to collect
                               coverage information
 /sourcelink:<file>            Source link info to embed into PDB.

                        - ERRORS AND WARNINGS -
 /warnaserror[+|-]             Report all warnings as errors
 /warnaserror[+|-]:<warn list> Report specific warnings as errors
 /warn:<n>                     Set warning level (0-4) (Short form: /w)
 /nowarn:<warn list>           Disable specific warning messages
 /ruleset:<file>               Specify a ruleset file that disables specific
                               diagnostics.
 /errorlog:<file>              Specify a file to log all compiler and analyzer
                               diagnostics.
 /reportanalyzer               Report additional analyzer information, such as
                               execution time.

                        - LANGUAGE -
 /checked[+|-]                 Generate overflow checks
 /unsafe[+|-]                  Allow 'unsafe' code
 /define:<symbol list>         Define conditional compilation symbol(s) (Short
                               form: /d)
 /langversion:<string>         Specify language version mode: ISO-1, ISO-2, 3,
                               4, 5, 6, 7, 7.1, Default, or Latest

                        - SECURITY -
 /delaysign[+|-]               Delay-sign the assembly using only the public
                               portion of the strong name key
 /publicsign[+|-]              Public-sign the assembly using only the public
                               portion of the strong name key
 /keyfile:<file>               Specify a strong name key file
 /keycontainer:<string>        Specify a strong name key container
 /highentropyva[+|-]           Enable high-entropy ASLR

                        - MISCELLANEOUS -
 @<file>                       Read response file for more options
 /help                         Display this usage message (Short form: /?)
 /nologo                       Suppress compiler copyright message
 /noconfig                     Do not auto include CSC.RSP file
 /parallel[+|-]                Concurrent build.
 /version                      Display the compiler version number and exit.

                        - ADVANCED -
 /baseaddress:<address>        Base address for the library to be built
 /checksumalgorithm:<alg>      Specify algorithm for calculating source file
                               checksum stored in PDB. Supported values are:
                               SHA1 (default) or SHA256.
 /codepage:<n>                 Specify the codepage to use when opening source
                               files
 /utf8output                   Output compiler messages in UTF-8 encoding
 /main:<type>                  Specify the type that contains the entry point
                               (ignore all other possible entry points) (Short
                               form: /m)
 /fullpaths                    Compiler generates fully qualified paths
 /filealign:<n>                Specify the alignment used for output file
                               sections
 /pathmap:<K1>=<V1>,<K2>=<V2>,...
                               Specify a mapping for source path names output by
                               the compiler.
 /pdb:<file>                   Specify debug information file name (default:
                               output file name with .pdb extension)
 /errorendlocation             Output line and column of the end location of
                               each error
 /preferreduilang              Specify the preferred output language name.
 /nostdlib[+|-]                Do not reference standard library (mscorlib.dll)
 /subsystemversion:<string>    Specify subsystem version of this assembly
 /lib:<file list>              Specify additional directories to search in for
                               references
 /errorreport:<string>         Specify how to handle internal compiler errors:
                               prompt, send, queue, or none. The default is
                               queue.
 /appconfig:<file>             Specify an application configuration file
                               containing assembly binding settings
 /moduleassemblyname:<string>  Name of the assembly which this module will be
                               a part of
 /modulename:<string>          Specify the name of the source module

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用.Net编译器Roslyn为C#代码创建控制流程图

是否可以使用net-core创建独立的可执行文件?

C#编译器可以编译VB.Net代码吗?

是否可以使用 .net core 5.0 创建 SOAP 服务?

使用Roslyn API编译.NET Core App

使用Roslyn和.NET Core生成C#代码

在VS2019 / .Net Core 3.1中使用“生产单个文件”发布选项时,是否可以使appsettings.json在部署后保持可编辑状态?

是否可以使用C#编译器添加PostSharp进行动态编译

GitHub上是否可以使用ASP.Net Core 3.1的ChangePasswordAsync?

是否可以使用.NET Core更改.cshtml视图并立即查看更改?

是否可以使用.net core编写肥皂网络服务?

是否可以使用循環添加所有 IHostedService 類(ASP.NET Core 6)?

您可以从常规 .net 应用程序中使用 Roslyn 编译器吗?

尝试使用简单的 ASP.NET Core 网站 RenderPartialAsync 时出现编译器错误

.Net Core 3自包含的单个可执行文件可以反编译吗?

您可以使用.net core运行F#脚本文件(.fsx)吗?

是否可以在Linux上使用.Net Core 3.1创建C ++ / CLI代码的C#DLL

C编译器编译的C源代码中可以使用static_cast吗?

是否可以使用VS Azure资源组项目将ASP.NET Core网站部署到Azure?

是否可以使用.Net EF Core从现有数据库加载部分对象方案?

Windows 8应用程序开发-是否可以使用System.Net.Sockets?(C#)

是否可以使用C#(.net)创建Cloud Watch自定义指标?

我可以使用.NET Core构建UWP吗?

我可以使用 ASP.NET Core 3.0 吗?

`.NET Compiler Platform SDK` & `C# 和 Visual Basic Roslyn 编译器` 之间的区别

是否可以使用SSH.NET在单个登录会话中执行多个SSH命令?

Scala编译器是否可以使用UTF-8编码的源文件?

是否可以使用各种编译器应用程序访问iOS上的文件?

是否可以使用ReactJS.Net在服务器端渲染jQuery?