繁体   English   中英

VS2017 C#默认程序集

[英]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”的情况下编译程序?

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

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

如果要在没有任何隐式程序集的情况下进行csc.exe <namefile>.cs -nostdlib -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的配置文件,该文件必须做得非常轻柔。 您可以在其他期刊中找到更多信息

如果您决定检查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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM