簡體   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