VS2017 C#默认程序集

时间:2019-03-08 23:32:31

标签: c# .net msbuild csc

为了测试信号量类,创建了示例:

using System;
using System.Threading;
class MyThread
{
    public Thread Thrd;
    static Semaphore sem = new Semaphore(2, 2);
....

但是我无法编译它给我这个错误(CS0246)

The type or namespace name 'Semaphore' could not be found 
(are you missing a using directive or an assembly reference?)

我从other issue找到了解决方案(“再次添加了参考'System'” )来解决此问题,但是问题诞生了-C#标准项目VS2017中的哪些默认程序集包括项目中没有其他参考?

由于.Net文档信号量类

  

定义命名空间:System.Threading

     

程序集:System.Threading.dll,System.dll,netstandard.dll

但是没有(“再次添加了参考'系统'” ),线程类 SemaphoreSlim类正常工作(没有编译器错误CS0246) ,由.Net文档针对这些类:

  

程序集:System.Threading.dll,mscorlib.dll,netstandard.dll

差异仅是 System.dll vs mscorlib.dll (这是预期的),但是当我尝试在命令提示符下再次通过csc.exe和msbuild编译程序时。 msbuild的结果与VS IDE相同(这是预期的)-编译错误CS0246,但是

csc.exe sem.cs -out:sem.exe

正在编译且没有错误,并且该程序运行并正常工作之后。

如果我正确理解(.Net docs)默认情况下,“ csc.exe”必须仅包含mscorlib.dll,则所有其他程序集必须通过选项“ -lib”或/和“ -reference”显式包括在内。

为什么通常在不显式引用“ System.Threading.dll,System.dll,netstandard.dll”的情况下编译程序?

1 个答案:

答案 0 :(得分:0)

PetSerAl的帮助下,我可以找到有关问题的答案:

  1. 如果通过csc.exe编译C#程序,则将包括默认程序集(没有由选项“ -reference”和“ -lib”明确指定的程序集):
    • mscorlib.dll(可以通过选项“ -nostdlib”抑制)
    • *。dll来自csc.rsp文件(可以通过选项“ -noconfig”抑制)

如果要在没有任何隐式程序集的情况下进行合并,请使用 csc.exe <namefile>.cs -nostdlib -noconfig

  1. 如果通过VS IDE或msbuild(使用“隐式” msbuild的VS IDE)编译C#程序,则使用默认程序集(无需在IDE中通过“添加引用”或通过编辑相应的“ .csproj”显式指定的程序集)文件)将被包含(如果使用模板VS2017“空项目(.Net Framework)):

    • mscorlib.dll
    • System.Core.dll

您可以通过在VS IDE中使用“视图/对象浏览器”进行检查,也可以通过运行具有显示构建数据的msbuild进行检查

msbuild <NameProject>.proj -v:diag

您可以在其中找到有关程序集的信息,该信息已包含在编译过程中。

您不能简单地禁止在编译过程中包括这些程序集,这要求更改msbuild的配置文件,该文件必须做得非常轻柔。您可以在other issue

中找到更多信息

如果您决定检查msbuild的配置文件及其工作方式,那么非常有用的是接收msbuild的工作环境(主要变量的值)。我可以推荐简单的项目(可以用记事本编写),

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
  <Target Name="ShowVar">
  <Message Text="Configuration is $(Configuration)" />
  <Message Text="MSBuildToolsPath is $(MSBuildToolsPath)" />
  <Message Text="MSBuildExtensionsPath is $(MSBuildExtensionsPath)" />
  <Message Text="MSBuildToolsVersion is $(MSBuildToolsVersion)" />
  <Message Text="FrameworkPathOverride is $(FrameworkPathOverride)" />
  <Message Text="MSBuildUserExtensionsPath is $(MSBuildUserExtensionsPath)" />
  <Message Text="AdditionalExplicitAssemblyReferences is $(AdditionalExplicitAssemblyReferences)" />
  </Target>
</Project>

如果在命令提示符msbuild test.csproj -t:ShowVar上运行build  您可以看到使用msbuild的主要变量的值(或者可以使用show build数据运行msbuild,如前所述)。

PS> 并且您了解到,默认情况下不包含信号量类(System.dll),但其中包含名称空间System和System.Threading,以及最常用的类。