为了测试信号量类,创建了示例:
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”的情况下编译程序??
答案 0 :(得分:0)
在PetSerAl的帮助下,我可以找到有关问题的答案:
如果要在没有任何隐式程序集的情况下进行合并,请使用
csc.exe <namefile>.cs -nostdlib -noconfig
如果通过VS IDE或msbuild(使用“隐式” msbuild的VS IDE)编译C#程序,则使用默认程序集(无需在IDE中通过“添加引用”或通过编辑相应的“ .csproj”显式指定的程序集)文件)将被包含(如果使用模板VS2017“空项目(.Net Framework)):
您可以通过在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,以及最常用的类。