代码之家  ›  专栏  ›  技术社区  ›  Andrew Savinykh

可以用编译单个C代码文件吗。NET Core Roslyn编译器?

  •  65
  • Andrew Savinykh  · 技术社区  · 7 年前

    在旧版本中。NET我们过去可以运行 csc

    具有我们拥有的净核心 dotnet build 坚持要有一个合适的项目文件。是否有一个独立的命令行编译器可以在没有项目的情况下编译源代码文件(并在同一命令行上列出引用的依赖项)?

    在Linux上,当我有旧的 还有新的。安装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 Core与旧版本的几百毫秒相比 对于同一个文件, Program.cs .

    csc公司

    5 回复  |  直到 5 年前
        1
  •  46
  •   Peter Mortensen icecrime    5 年前

    是的,可以在中使用csc或vbc编译器编译单个文件。净核心。

    csc。{exe | dll} System.Runtime System.Private.CoreLib 图书馆和任何其他必要的参考资料。下面的列表显示了如何编译以下内容 Hello, World!

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

    将WSL与一起使用 Ubuntu 16.04

    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
    

    System.Runtime.dll System.Console.dll System.Private.CoreLib.dll . 不同的SDK版本将在不同的位置安装Roslyn和命令行驱动程序-不同版本的SDK布局有所不同-最新的2.2.2 SDK随附 csc.dll vbc.dll 而不是 csc.exe vbc.exe . 因此,在使用此方法之前,有必要检查SDK布局。

    详细说明

    Roslyn编译器的设计方式与以前使用的略有不同 vbc。exe文件 编译器。首先,Roslyn是用C和VB编写的。NET是一个托管。NET应用程序。在Windows上,它主要用作在服务器进程中运行的公共服务 VBCSCompiler.exe (.dll)。然而,Roslyn提供了托管命令行驱动程序, csc。dll )它可以用于直接从命令行编译源文件。无论如何,这正是构建系统的目的。NET,通过命令行调用Roslyn。运行简单的 dotnet csc.exe -help

    Ready To Run ),将需要从加载整个开始。NET框架,初始化它,然后加载Roslyn程序集并开始编译过程。然而,从上面的计时可以看出,它总是比运行本机编译器慢一点,没有那么慢。

    有一篇新的文档文章添加到 corefx 存储库描述 Advanced scenario - Build and run application code with csc/vbc and CoreRun . 任何感兴趣的人都可以将其作为如何在低级别工作的指南。净核心。

        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
    
        2
  •  24
  •   vulcan raven    4 年前

    公认的答案是使用 System.Private.CoreLib.dll 这是一个运行时程序集,不建议使用。从…起 C# compiler developer's comments

    尝试将运行时程序集用作编译引用不是 支持并经常中断运行时的结构 组件

    相反,应使用参考程序集。引用程序集是在 dotnet build csc 运行时可以看到调用 dotnet 增加了详细性的CLI( dotnet build --verbosity normal ). 可能会看到对程序集的引用,如 System.Runtime.dll System.Console.dll microsoft.netcore.app NuGet包。

    但是,对于简单的单个文件 Hello, World! netstandard.dll <installation-directory>/sdk/2.2.203/ref/netstandard.dll .

    dotnet HelloWorld.exe HelloWorld.runtimeconfig.json 必须创建,包含目标。NET Core运行时版本。我们将通过为控制台(NETCoreApp)应用程序创建一个通用的runtimeconfig和一个伴随的别名来简化它 csc_run .

    将以下内容添加到 ~/.profile :

    #!/usr/bin/env sh
    
    # IMPORTANT: make sure dotnet is present in PATH before the next lines
    
    # prepare csc alias
    
    DOTNETDIR=$(dirname $(dirname $(dotnet --info | grep "Base Path" | cut -d' ' -f 6)))
    CSCPATH=$(find $DOTNETDIR -name csc.dll -print | sort | tail -n1)
    NETSTANDARDPATH=$(find $DOTNETDIR -path *sdk/*/ref/netstandard.dll ! -path *NuGetFallback* -print | sort | tail -n1)
    
    alias csc='dotnet $CSCPATH /r:$NETSTANDARDPATH '
    
    # prepare csc_run alias
    
    if [ ! -w "$DOTNETDIR" ]; then
      mkdir -p $HOME/.dotnet
      DOTNETDIR=$HOME/.dotnet
    fi
    
    DOTNETCSCRUNTIMECONFIG=$DOTNETDIR/csc-console-apps.runtimeconfig.json
    
    alias csc_run='dotnet exec --runtimeconfig $DOTNETCSCRUNTIMECONFIG '
    
    if [ ! -f $DOTNETCSCRUNTIMECONFIG ]; then
      DOTNETRUNTIMEVERSION=$(dotnet --list-runtimes |
        grep Microsoft\.NETCore\.App | tail -1 | cut -d' ' -f2)
    
      cat << EOF > $DOTNETCSCRUNTIMECONFIG
    {
      "runtimeOptions": {
        "framework": {
          "name": "Microsoft.NETCore.App",
          "version": "$DOTNETRUNTIMEVERSION"
        }
      }
    }
    EOF
    fi
    

    退出并启动shell以重新加载配置文件(或源配置文件 . ~/.profile 如果您不想退出当前会话)。

    用法:

    cat << EOF > ./Program.cs
    class Program
    {
      static void Main() => System.Console.WriteLine("Hello World!");
    }
    EOF
    
    csc     -out:hwapp.exe Program.cs
    csc_run hwapp.exe
    
    # Hello World!
    
        3
  •  6
  •   Peter Mortensen icecrime    5 年前

    可以使用直接调用编译器

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

    然而,如果没有支持的项目基础设施,这个特定的命令可能没有多大帮助,因为您需要全部传递。NET Core或。NET标准引用程序集,通常由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
    
        4
  •  0
  •   Peter Mortensen icecrime    5 年前

    简而言之,如果没有预定义的项目,它是不受支持的。

    error CS0518: Predefined type 'System.Object' is not defined or imported #12393

    目前,我们没有计划使csc易于使用。此中的exe 方式指导是暂时使用dotnet CLI工具 提供统一和/或简化参考的框架 比现在(按设计)复杂的类型或程序集分辨率。

    另请参见关闭 Make it possible to invoke the compiler directly #7689 .

        5
  •  0
  •   Kinglionsz    4 年前
    This is the scripts:
    
    
    
    #!/bin/bash
    
    #dotnethome=`dirname "$0"`
    dotnethome=`dirname \`which dotnet\``
    sdkver=$(dotnet --version)
    fwkver=$(dotnet --list-runtimes | grep Microsoft.NETCore.App | awk '{printf("%s", $2)}')
    dotnetlib=$dotnethome/shared/Microsoft.NETCore.App/$fwkver
    
    if [ "$#" -lt 1 ]; then
        dotnet $dotnethome/sdk/$sdkver/Roslyn/bincore/csc.dll -help
        echo dotnethome=$dotnethome
        echo sdkver=$sdkver
        echo fwkver=$fwkver
        echo dotnetlib=$dotnetlib
        exit 1
    fi
    
    progfile=$1
    prog="${progfile%.*}"
    echo -r:$dotnetlib/netstandard.dll > /tmp/$prog.rsp
    echo -r:$dotnetlib/System.dll >> /tmp/$prog.rsp
    echo -r:$dotnetlib/Microsoft.CSharp.dll >> /tmp/$prog.rsp
    for f in  $dotnetlib/System.*.dll; do
        echo -r:$f >> /tmp/$prog.rsp
    done
    
    dotnet $dotnethome/sdk/$sdkver/Roslyn/bincore/csc.dll -out:$prog.dll -nologo @/tmp/$prog.rsp $* 
    if [ $? -eq 0 ]; then
       if test -f "$prog.dll"; then
        if ! test -f "$prog.runtime.config"; then
            echo "{
      \"runtimeOptions\": {
        \"framework\": {
          \"name\": \"Microsoft.NETCore.App\",
          \"version\": \"$fwkver\"
        }
      }
    }"  > "$prog.runtimeconfig.json"
        fi
      fi
    fi
    echo /tmp/$prog.rsp: 
    cat /tmp/$prog.rsp
    rm /tmp/$prog.rsp