[英]C# ConfigurationErrorsException and XmlException on Dns.GetHostName VS2017
[英]VS2017 C# default assemblies
为了测试信号量类,创建了示例:
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?)
我找到了解决方案( “再次添加了参考'System'” ),以从其他问题中解决此问题,但是问题诞生了-C#标准项目VS2017中的哪些默认程序集在项目中没有其他引用就包括在内?
因为通过.Net文档信号量类
定义命名空间:System.Threading
程序集:System.Threading.dll,System.dll,netstandard.dll
但是,通过.Net文档,没有这些( “再次添加参考'系统'” ), 线程类和SemaphoreSlim类可以正常工作(没有编译器错误CS0246):
程序集:System.Threading.dll,mscorlib.dll,netstandard.dll
区别仅在于System.dll与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”的情况下编译程序?
如果要在没有任何隐式程序集的情况下进行csc.exe <namefile>.cs -nostdlib -noconfig
,请使用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的配置文件,该文件必须做得非常轻柔。 您可以在其他期刊中找到更多信息
如果您决定检查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 data运行msbuild,如前所述)。
PS>正如您所了解的那样,默认情况下不包括信号量类 (System.dll),但包括名称空间System和System.Threading,以及最常用的类。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.