VS2017 C # сборки по умолчанию

Для тестирования Semaphore Class был создан образец:

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?)

Я нашел решение (снова добавил ссылку "Система") для решения этой проблемы из другая проблема, но возник вопрос - какие сборки по умолчанию в стандартный проект C # VS2017 включают без дополнительных ссылок в проект?

Потому что согласно документации .Net Класс семафоров

Определение пространства имен: System.Threading

Сборки: System.Threading.dll, System.dll, netstandard.dll

Но без (снова добавлена ​​ссылка "Система") класс потока и класс SemaphoreSlim работали нормально (без ошибки компилятора CS0246), согласно документации .Net для этих классов:

Сборки: 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?


person Denis Sivtsov    schedule 08.03.2019    source источник
comment
Вы используете -noconfig?   -  person user4003407    schedule 09.03.2019
comment
@PetSerAl Вы чертовски хороши :) Вы были правы с параметром -noconfig (без файла csc.rsp) он работает (csc.exe) так же, как msbuild   -  person Denis Sivtsov    schedule 09.03.2019
comment
Но как быть с другими сборками System.Threading.dll, netstandard.dll, которые были заявлены для класса семафор, класса потока и класса SemaphoreSlim? Этих DLL отсутствуют в файле csc.rsp?   -  person Denis Sivtsov    schedule 09.03.2019
comment
Сборка зависит от вашей целевой платформы. Это System.Threading.dll для .NET Core, System.dll для .NET Framework и netstandard.dll для .NET Standard. Вам нужен только один, а не все три.   -  person user4003407    schedule 09.03.2019


Ответы (1)


С помощью PetSerAl я смог найти ответы на свои вопросы:

  1. If you compile C# program by csc.exe, the default assemblies (without any explicitly specified by option "-reference" & "-lib") will be included:
    • mscorlib.dll (can be suppressed by option "-nostdlib")
    • * .dll из файла csc.rsp (можно запретить опцией "-noconfig")

Если вы хотите выполнить компиляцию без каких-либо неявных сборок, используйте csc.exe <namefile>.cs -nostdlib -noconfig

  1. Если вы компилируете программу C # с помощью VS IDE или msbuild (VS IDE использует «неявно» msbuild), сборки по умолчанию (без явного указания «Добавить ссылку» в среде IDE или путем редактирования соответствующего файла «.csproj») будут включать ( в случае использования шаблона VS2017 «Пустой проект (.Net Framework)):

    • mscorlib.dll
    • System.Core.dll

Вы можете проверить это, используя "View / Object Browser" в VS IDE или запустив msbuild с данными сборки show.

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, вы можете увидеть значения основных переменных, которые используют msbuild (или вы можете запустить msbuild с показом данных сборки, как написано выше).

PS> И, как вы поняли, класс семафоров (System.dll) по умолчанию не включает, но пространства имен System и System.Threading, а наиболее часто используемые классы: включены.

person Denis Sivtsov    schedule 09.03.2019