![](/img/trans.png)
[英]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.