VS2017 C # сборки по умолчанию - PullRequest
0 голосов
/ 09 марта 2019

Для тестирования 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

Разницаis System.dll против mscorlib.dll oтолько (это ожидается), но когда я пытаюсь, в командной строке снова скомпилируйте программу с помощью 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 голосов
/ 10 марта 2019

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

  1. Если вы компилируете программу на C # с помощью csc.exe, сборки по умолчанию (без каких-либо явных указанийопция "-reference" & "-lib") будет включена:
    • mscorlib.dll (может быть отключена опцией "-nostdlib")
    • *. dll из файла csc.rsp (может быть подавлено опцией "-noconfig")

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

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

  • mscorlib.dll
  • System.Core.dll

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

msbuild <NameProject>.proj -v:diag

, где вы можете найти информацию о сборках, котораябыл включен в процесс компиляции.

Вы не можете просто запретить включение этих сборок в процесс компиляции, это требует изменения файлов конфигурации msbuild, что должно выполняться очень осторожно. Дополнительную информацию вы можете найти в Другая проблема

Если вы решите проверить файлы конфигурации msbuild и как это работает, очень полезно будет получить рабочую средуEnt of 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 и наиболее часто используемые классы.

...