You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows下命令行调用csc编译找不到Span<>类型报错如何解决

问题描述

我有一个项目可在GNU/Linux系统正常运行,兼容dotnet-sdk-5.0,添加#if条件编译后还可适配Mono。
现在我尝试在Windows系统编译该项目,执行nmake win时报错如下:

csc -nologo -t:library -out:ecn-bitn.dll unmngd.cs monosupp.cs
unmngd.cs(184,48): error CS0246: The type or namespace name 'Span<>' could not be found (are you missing a using directive or an assembly reference?)
unmngd.cs(189,48): error CS0246: The type or namespace name 'Span<>' could not be found (are you missing a using directive or an assembly reference?)
unmngd.cs(75,47): error CS0246: The type or namespace name 'Span<>' could not be found (are you missing a using directive or an assembly reference?)
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\bin\Roslyn\csc.EXE"' : return code '0x1'
Stop.

我查阅资料得知Span<>类型定义在System.Memory.dll中,于是添加引用编译,又出现找不到该程序集的报错:

C:\misc\e\dotnet>csc -nologo -t:library -out:ecn-bitn.dll unmngd.cs monosupp.cs -r:System.Memory.dll
error CS0006: Metadata file 'System.Memory.dll' could not be found

但我通过WSL1的locate命令查询到系统中存在多个System.Memory.dll副本:

myusername@DESKTOP-PN6OO9E:/mnt/c/misc/e/dotnet $ locate -i system.memory.dll
/mnt/c/Program Files/WindowsApps/Microsoft.YourPhone_1.21102.134.0_x64__8wekyb3d8bbwe/System.Memory.dll
/mnt/c/Program Files/WindowsApps/Microsoft.YourPhone_1.21102.134.0_x64__8wekyb3d8bbwe/YourPhoneAppProxy/System.Memory.dll
/mnt/c/Program Files/WindowsApps/Microsoft.YourPhone_1.21102.134.0_x64__8wekyb3d8bbwe/YourPhoneServer/System.Memory.dll
/mnt/c/Program Files/dotnet/packs/Microsoft.NETCore.App.Ref/3.1.0/ref/netcoreapp3.1/System.Memory.dll
/mnt/c/Program Files/dotnet/packs/Microsoft.NETCore.App.Ref/5.0.0/ref/net5.0/System.Memory.dll
/mnt/c/Program Files/dotnet/packs/NETStandard.Library.Ref/2.1.0/ref/netstandard2.1/System.Memory.dll
/mnt/c/Program Files (x86)/Microsoft Visual Studio/2019/Community/Common7/IDE/CommonExtensions/Microsoft/CrossRepositorySearch/ServiceHub/System.Memory.dll
/mnt/c/Program Files (x86)/Microsoft Visual Studio/2019/Community/Common7/IDE/CommonExtensions/Microsoft/FSharp/System.Memory.dll
/mnt/c/Program Files (x86)/Microsoft Visual Studio/2019/Community/Common7/IDE/CommonExtensions/Microsoft/ManagedLanguages/VBCSharp/LanguageServices/InteractiveHost/Desktop/System.Memory.dll
/mnt/c/Program Files (x86)/Microsoft Visual Studio/2019/Community/Common7/IDE/Extensions/Microsoft/AppInsights/Contracts/System.Memory.dll
/mnt/c/Program Files (x86)/Microsoft Visual Studio/2019/Community/Common7/IDE/Extensions/Microsoft/AppInsights/Core/System.Memory.dll
/mnt/c/Program Files (x86)/Microsoft Visual Studio/2019/Community/Common7/IDE/Extensions/Microsoft/ConnectedServices/System.Memory.dll
/mnt/c/Program Files (x86)/Microsoft Visual Studio/2019/Community/Common7/IDE/Extensions/Microsoft/ConnectedServices/Authentication/System.Memory.dll
/mnt/c/Program Files (x86)/Microsoft Visual Studio/2019/Community/Common7/IDE/Extensions/Microsoft/IntelliCode/CLI/System.Memory.dll
/mnt/c/Program Files (x86)/Microsoft Visual Studio/2019/Community/Common7/IDE/Extensions/Microsoft/IntelliCode/CLI/Extractors/CPlusPlus/System.Memory.dll
/mnt/c/Program Files (x86)/Microsoft Visual Studio/2019/Community/Common7/IDE/Extensions/Microsoft/IntelliCode/CLI/Extractors/csharp/System.Memory.dll
/mnt/c/Program Files (x86)/Microsoft Visual Studio/2019/Community/Common7/IDE/Extensions/Microsoft/LiveShare/Agent/System.Memory.dll
/mnt/c/Program Files (x86)/Microsoft Visual Studio/2019/Community/Common7/IDE/Extensions/Xamarin/Templates/System.Memory.dll
/mnt/c/Program Files (x86)/Microsoft Visual Studio/2019/Community/Common7/IDE/Extensions/Xamarin.VisualStudio/System.Memory.dll
/mnt/c/Program Files (x86)/Microsoft Visual Studio/2019/Community/Common7/IDE/PrivateAssemblies/System.Memory.dll
/mnt/c/Program Files (x86)/Microsoft Visual Studio/2019/Community/Common7/IDE/PublicAssemblies/System.Memory.dll
/mnt/c/Program Files (x86)/Microsoft Visual Studio/2019/Community/Common7/IDE/ReferenceAssemblies/Microsoft/Framework/MonoAndroid/v1.0/Facades/System.Memory.dll
/mnt/c/Program Files (x86)/Microsoft Visual Studio/2019/Community/Common7/IDE/ReferenceAssemblies/Microsoft/Framework/MonoTouch/v1.0/Facades/System.Memory.dll
/mnt/c/Program Files (x86)/Microsoft Visual Studio/2019/Community/Common7/IDE/ReferenceAssemblies/Microsoft/Framework/Xamarin.Mac/v2.0/Facades/System.Memory.dll
/mnt/c/Program Files (x86)/Microsoft Visual Studio/2019/Community/Common7/IDE/ReferenceAssemblies/Microsoft/Framework/Xamarin.TVOS/v1.0/Facades/System.Memory.dll
/mnt/c/Program Files (x86)/Microsoft Visual Studio/2019/Community/Common7/IDE/ReferenceAssemblies/Microsoft/Framework/Xamarin.WatchOS/v1.0/Facades/System.Memory.dll
/mnt/c/Program Files (x86)/Microsoft Visual Studio/2019/Community/Common7/IDE/ReferenceAssemblies/Microsoft/Framework/Xamarin.iOS/v1.0/Facades/System.Memory.dll
/mnt/c/Program Files (x86)/Microsoft Visual Studio/2019/Community/Common7/ServiceHub/Hosts/ServiceHub.Host.CLR.AnyCPU/PrivateHost/System.Memory.dll
/mnt/c/Program Files (x86)/Microsoft Visual Studio/2019/Community/Common7/ServiceHub/Hosts/ServiceHub.Host.CLR.x64/PrivateHost/System.Memory.dll
/mnt/c/Program Files (x86)/Microsoft Visual Studio/2019/Community/Common7/ServiceHub/Hosts/ServiceHub.Host.CLR.x86/PrivateHost/System.Memory.dll
/mnt/c/Program Files (x86)/Microsoft Visual Studio/2019/Community/Common7/ServiceHub/Services/Microsoft.Developer.IdentityService/System.Memory.dll
/mnt/c/Program Files (x86)/Microsoft Visual Studio/2019/Community/Common7/ServiceHub/controller/System.Memory.dll
/mnt/c/Program Files (x86)/Microsoft Visual Studio/2019/Community/CoreCon/Binaries/Phone Tools/Debugger/CoreClr/arm64/System.Memory.dll
/mnt/c/Program Files (x86)/Microsoft Visual Studio/2019/Community/MSBuild/Current/Bin/System.Memory.dll
/mnt/c/Program Files (x86)/Microsoft Visual Studio/2019/Community/MSBuild/Current/Bin/Roslyn/System.Memory.dll
/mnt/c/Program Files (x86)/Microsoft Visual Studio/2019/Community/MSBuild/Current/Bin/amd64/System.Memory.dll
/mnt/c/Program Files (x86)/Microsoft Visual Studio/2019/Community/MSBuild/Xamarin/Android/bcl/Facades/System.Memory.dll
/mnt/c/Program Files (x86)/Microsoft Visual Studio/2019/Community/MSBuild/Xamarin/Mac/System.Memory.dll
/mnt/c/Program Files (x86)/Microsoft Visual Studio/2019/Community/MSBuild/Xamarin/iOS/System.Memory.dll

我需要保证项目可移植,不能硬编码路径。补充信息:GNU/Linux下Makefile调用csc的方式如下,因为系统不存在独立的csc二进制文件:

dotnet /usr/share/dotnet/sdk/5.0.403/Roslyn/bincore/csc.dll -nologo -lib:/usr/share/dotnet/shared/Microsoft.NETCore.App/5.0.12 -r:netstandard.dll -r:Microsoft.CSharp.dll -r:System.dll $(cd /usr/share/dotnet/shared/Microsoft.NETCore.App/5.0.12 && for x in System.*.dll; do echo -r:$x; done) -r:Microsoft.Win32.Primitives.dll -t:library -out:ecn-bitn.dll unmngd.cs monosupp.cs

Windows端我是通过vsdevcmd.bat启动开发环境,使用的是VS2019自带的Roslyn编译器,我已经将VS2019升级到最新的16.11.7版本,且已安装“.NET跨平台开发”工作负载及相关组件。
更新:我编译运行了单行测试代码:

System.Console.WriteLine(System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription);

发现Windows下的csc默认面向.NET 4.8编译,而Span<T>的完整支持(比如IPAddress构造函数中的支持)是在.NET 5才加入的,我猜测需要类似GNU/Linux下用dotnet工具调用csc的方式处理,请问如何解决该问题?

解决方案

  • 优先采用和Linux端对齐的dotnet命令调用编译器,Windows安装.NET 5 SDK后会自动配置全局dotnet命令,无需硬编码路径,直接替换nmake中的编译命令即可:
dotnet csc -nologo -t:library -out:ecn-bitn.dll unmngd.cs monosupp.cs

dotnet csc会自动关联当前SDK对应的引用程序集,包含System.Memory.dll,可以直接识别Span<T>类型,编译逻辑和Linux端完全一致,保证跨平台一致性。

  • 如果需要保留直接调用csc.exe的逻辑,有两种可选适配方案:
    1. 调整编译目标框架:在编译参数中添加-lib:"%DOTNET_ROOT%\packs\Microsoft.NETCore.App.Ref\5.0.0\ref\net5.0",DOTNET_ROOT是.NET SDK安装时自动配置的系统环境变量,无需硬编码,添加后csc就能找到对应的System.Memory.dll引用。
    2. 兼容.NET Framework场景:通过NuGet安装System.Memory包,编译时自动引入对应依赖,无需手动指定程序集路径。
  • 临时验证方案:如果只是快速测试,可以在vsdevcmd中执行dotnet run命令直接运行测试代码,默认面向.NET 5+编译,能直接验证Span<T>相关逻辑。

内容的提问来源于stack exchange,提问作者mirabilos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 15:54:04