关于c#:无法从常规命令提示符编译.cs文件,只能编译开发人员命令提示符?

Unable to compile .cs file from regular command prompt, only Developer Command Prompt?

我有一个使用Visual Studio开发的非常简单的控制台应用程序。有了它,我把一个简单的C程序放在一起,使用"developer command prompt for vs2015"导航到我的目录并运行"cs c program.cs"来编译"program.exe"文件。从那里我可以输入"program**",并传递一个文件名,如"program file.asm"。

一切正常。但是,我想从普通命令提示符运行这个命令。当我在developer命令提示符中编译vs2015时,将输出以下两行:

1
2
Microsoft (R) Visual C# Compiler version 1.3.1.60616
Copyright (C) Microsoft Corporation. All rights reserved.

当我导航时,我可以看到在c:windowsmicrosoft.netframework下,我有以下文件夹选项:

  • V1.0.3705
  • V1.1.4322
  • V2.0.50727
  • V3.0
  • V3.5
  • V4.0.30319

当我这样做的时候:

C:windowsmicrosoft.netframeworkv3.5cs c.exe C:directory…program.cs

输出为:

Microsoft(R)Visual C 2008编译器3.5.30729.5420(R).NET Framework 3.5版)版权所有(c)Microsoft Corporation。版权所有。

C:usersdirectory…program.cs(5,24):错误CS0234:命名空间"system.threading"中不存在类型或命名空间名称"tasks"(是否缺少程序集引用?)

然后我尝试使用v4.0.30319:

C:windowsmicrosoft.netframeworkv4.0.30319cs c.exe C:directory…program.cs

输出:

用于C 5的Microsoft(R)Visual C编译器4.6.1055.0版版权所有(c)Microsoft Corporation。版权所有。此编译器作为Microsoft(R).NET Framework的一部分提供,但只支持C_5之前的语言版本,而C_5之前的语言版本不再是最新版本。有关支持较新版本C编程语言的编译器,请参阅http://go.microsoft.com/fwlink/?林奇=533240cscd777ae6152014d6aaec769e73b879b29.tmp:错误cs1567:生成win32资源时出错:访问被拒绝。警告cs1610:无法删除用于默认win32资源的临时文件"c:windowsmicrosoft.netframeworkv4.0.30319cscd777ae6152014d6aaec769e73b879b29.tmp"--系统找不到指定的文件。

有人能帮助我理解为什么这一切对于开发者命令提示很好,但是即使在完全量化"csc.exe"的路径时,常规命令提示也失败了?


我认为你在尝试很多事情,却不了解正在发生的事情。

0

当您从这个特定的命令提示符运行C编译器时,csc.exe在路径中。为了查明在Unix上运行的确切命令,我们使用了一个名为which的命令。您可以尝试gnu-utils或cygwin,或者只需手动遍历path(任何情况)变量中指定的所有目录,以找出有问题的csc.exe驻留的确切路径。这样您就可以知道编译器的确切路径。更新:您可以在Windows上使用where命令来查找命令的完整路径(感谢@scottchamberlain)

c:\Users\directory...\Program.cs(5,24): error CS0234: The type or namespace name 'Tasks' does not exist in the namespace 'System.Threading' (are you missing an assembly reference?)

在同一提示下运行csc.exe /?,并查看编译器支持的所有选项。其中一个是/r,用于添加对dll的引用

When I do:

C:\Windows\Microsoft.NET\Framework\v3.5\csc.exe C:\directory...\Program.cs

CSCD777AE6152014D6AAEC769E73B879B29.TMP: error CS1567: Error generating Win32 resource: Access is denied. wrning CS1610: Unable to delete temporary file 'c:\Windows\Microsoft.NET\Framework\v4.0.30319\CSCD777AE6152014D6AAEC769E73B879B29.TMP' used for default Win32 resource -- The system cannot find the file specified.

您可能希望位于文件Program.cs的目录中。这样,您就可以对文件夹具有写权限,以生成必要的输出文件。也可以使用/out选项指定输出文件名。

Can anyone help me understand why this is all working fine for Developer Command Prompt but failing for regular command prompt even when fully quantifying the path for"csc.exe"?

最可能的原因是路径环境变量不同。Visual Studio命令提示,在启动命令提示后设置一组环境变量。您可以通过在两个终端上运行set命令并对其输出进行比较,来查看两个提示之间的环境差异。不用说,某些环境变量总是不同的,这不是由于vs.net造成的。

正如@keithnocholas在评论中提到的,您可以简单地调用C:\Program Files (x86)\Microsoft Visual Studio *\Common7\Tools\VsDevCmd.bat来设置常规的命令提示,如Visual Studio命令提示