在旧的.net中,我们曾经能够运行csc编译器来编译单个cs文件或多个文件.使用.net核心,我们csc坚持拥有一个合适的项目文件.是否有一个独立的命令行编译器,它允许编译源代码文件而无需项目(并列出在同一命令行上引用的依赖项)?
在Linux上,当我安装了旧的csc和新的.net核心时,我得到了这些时间:
[root@li1742-80 test]# time dotnet build
Microsoft (R) Build Engine version 15.3.409.57025 for .NET Core
Copyright (C) Microsoft Corporation. All rights reserved.
test -> /root/test/bin/Debug/netcoreapp2.0/test.dll
Build succeeded.
0 Warning(s)
0 Error(s)
Time Elapsed 00:00:03.94
real 0m7.027s
user 0m5.714s
sys 0m0.838s
[root@li1742-80 test]# time csc Program.cs
Microsoft (R) Visual C# Compiler version 2.3.0.61801 (3722bb71)
Copyright (C) Microsoft Corporation. All rights reserved.
real 0m0.613s
user 0m0.522s
sys 0m0.071s
[root@li1742-80 test]#
Run Code Online (Sandbox Code Playgroud)
使用.net核心注意7秒,使用旧csc注意几百毫秒dotnet build.
我希望能够使用.net核心快速编译,因为我曾经能够使用csc.
C#4,为简化COM互操作,允许调用者在COM接口中省略ref参数前面的ref关键字.
我很惊讶今天看到这也适用于扩展COM接口的扩展方法.请参阅以下内容,编译代码:
using System;
using System.Runtime.InteropServices;
[ComImport, Guid ("cb4ac859-0589-483e-934d-b27845d5fe74")]
interface IFoo {
}
static class Program {
public static void Bar (this IFoo self, ref Guid id)
{
id = Guid.NewGuid ();
}
static void Main ()
{
Foo (null);
}
static void Foo (IFoo o)
{
Guid g = Guid.NewGuid ();
Console.WriteLine (g);
// note that g is passed as is, and not as ref g
o.Bar (g);
Console.WriteLine (g);
}
}
Run Code Online (Sandbox Code Playgroud)
我没有在规范中找到任何解释这种行为的内容.
我的感觉是COM接口之外的代码,即使它是扩展COM接口的扩展方法,也应该遵循常规的C#规则,并强制使用ref关键字.因此我在连接上提交了一个错误.并不是说我认为这将被修复,即使它被认为是一个bug,已经有代码依赖于此.
错误?不是一个bug?
我正在玩Roslyn的一些更改,但不幸的是,即使是未经修改的解决方案也会在我运行时崩溃VisualStudioSetup.Next,并且在尝试加载MS程序集时出错.所以我做了一些简单的更改,用新版本替换了我机器的现有二进制文件和配置文件.改变了C:/Program Files (x86)/MSBuild/bin and Windows/Microsoft.NET/Framework64.
替换CSC,VBCSCompiler,DLL和配置文件会导致csc.exe在任何构建上抛出错误.它抱怨清单指定了不同版本的CodeAnalysis.CSharpDLL.它没有为文件甚至名称提供路径.我用新版本替换了上述文件夹中的配置和DLL.我需要实际替换哪些文件才能正常工作?
我搜索了所有CSC实例的整个驱动器,并确保所有配置指定DLL的新版本,所以我不知道现在在哪里查看.
我知道可以将参数传递给MSBuild或者向csproj文件添加一个部分来指定编译器二进制文件的目录,但是我想获得胜利.
编辑:所以我决定只更改我的版本的版本号.通过VS中的程序集属性执行此操作会导致构建失败.我尝试使用MSBuild,但在每个项目中都出现此错误:
"F:\Git\Repos\roslyn\src\Compilers\CSharp\csc\csc.csproj" (default target) (1) ->
F:\Git\Repos\roslyn\build\Targets\Versions.props(42,5):
error MSB4184: The expression ""1".Substring(3)" cannot be evaluated.
startIndex cannot be larger than length of string.
Parameter name: startIndex F:\Git\Repos\roslyn\src\Compilers\CSharp\csc\csc.csproj]
Run Code Online (Sandbox Code Playgroud)
它尽管从VS建立起来很好.
MSBuild参数: /p:OfficialBuild=true /p:BuildNumber=1.3.1.60616 /p:Configuration=Release
我现在正在使用谷歌JSON/Atom自定义搜索API.问题是总查询每天只有100个.需要支付额外的查询.
有免费的 自定义搜索API吗?也许来自Bing或雅虎?
谢谢!
有了这个简单的C#代码,我就跑了csc hello.cs; ildasm /out=hello.txt hello.exe.
class Hello
{
public static void Main()
{
System.Console.WriteLine("hi");
}
}
Run Code Online (Sandbox Code Playgroud)
这是来自ildasm的IL代码.
.class private auto ansi beforefieldinit Hello
extends [mscorlib]System.Object
{
.method public hidebysig static void Main() cil managed
{
.entrypoint
// Code size 13 (0xd)
.maxstack 8
IL_0000: nop
IL_0001: ldstr "hi"
IL_0006: call void [mscorlib]System.Console::WriteLine(string)
IL_000b: nop
IL_000c: ret
} // end of method Hello::Main
.method public hidebysig specialname rtspecialname
instance void .ctor() cil managed
{
// Code size 7 (0x7) …Run Code Online (Sandbox Code Playgroud) 使用C#代码提供程序和 ICodeCompiler.CompileAssemblyFromSource方法,我试图编译代码文件,以生成可执行程序集.
我想编译的代码使用了可选参数和扩展方法等功能,这些功能仅在使用C#4语言时才可用.
话虽如此,我想编译的代码只需要(并且需要)以.NET Framework 2.0版为目标.
使用前面的代码可以避免任何与语法有关的编译时错误,但是,生成的程序集将以框架的4.0版为目标,这是不合需要的.
var compiler = new CSharpCodeProvider(
new Dictionary<string, string> { { "CompilerVersion", "v4.0" } } );
Run Code Online (Sandbox Code Playgroud)
我怎样才能使代码提供程序针对语言版本4.0但生成一个只需要框架版本2.0的程序集?
出于一些非常奇怪的原因,我的Visual Studio 2008在尝试编译C#项目时,尝试将可执行文件的输出写入与可执行文件同名的目录,至少看起来这就是错误消息所暗示的内容.在我的任何项目上运行Compile后,CSC.EXE报告以下编译器错误:
无法写入输出文件'D:\ Projects\Examples\StringBuilderVsString\_obj\Release\StringBuilderVsString.exe' - '目录名无效."
当我查看内部obj\Release或obj\Debug所有中间资源时,如StringBuilderVsString.pdb正确地写在该目录中.目录中没有空格.从命令提示符运行csc.exe时也会发生此错误.
运行Process Monitor时,我只看到csc.exe访问的文件的SUCCESS,我没有看到任何查询或写入不存在的位置.
任何解决这个问题的想法都是受欢迎的.
我正在使用C#中的一些F#类型(Matrix等),所以我需要在我的C#项目中引用FSharp.Core程序集.到现在为止还挺好.
但是,显然在mscorlib.dll(v4)中定义了一些在FSharp.Core(v2)中"重复"的类型,如System.Tuple和System.IObservable.我无法理解为什么这是在.Net 4.Matt Ellis明确表示他们将在他的MSDN文章中删除:
一种遭受[重复]问题的语言是F#,它以前在FSharp.Core.dll中定义了自己的元组类型,但现在将使用Microsoft .NET Framework 4中添加的元组.
如果我能指定我想在C#程序中使用哪一个,我已经准备好了解这个特别不合时宜的重复.System.Tuple例如,当我尝试使用该类型时,我得到以下C#编译器错误:
错误2"c:\ Program Files(x86)\ Reference Assemblies\Microsoft\Framework.NETFramework\v4.0\Profile\Client\mscorlib.dll"和"c:\ Program Files"中都存在"System.Tuple"类型(x86)\ Reference Assemblies\Microsoft\FSharp\2.0\Runtime\v2.0\FSharp.Core.dll'
显然,解决这个问题的方法是在C#编译器命令行上切换该类型的别名:
csc.exe MyType.cs /reference:System.Tuple`2=mscorlib.dll /reference:FSharp.Core.dll
但是,我找不到让Visual Studio将此参数发送到C#编译器的方法.
有人有解决方案吗?
尝试在Visual Studio 2012 Professional中编译和测试任何类型的项目时,我收到以下错误.
错误1无法运行指定的任务可执行文件"Csc.exe".指定的可执行文件不是此OS平台的有效应用程序.
在线测试多个建议后,没有解决问题.谁知道是什么原因导致的?是否有新版本的Csc.exe我需要获取?我知道这是编译器只是不确定我需要做些什么来解决问题.
这段代码有什么问题:
using System;
namespace app1
{
static class Program
{
static int x = 0;
static void Main()
{
fn1();
}
static void fn1()
{
Console.WriteLine(x++);
fn1();
}
}
}
Run Code Online (Sandbox Code Playgroud)
我使用这个命令编译这段代码:
csc /warn:0 /out:app4noex.exe app4.cs
Run Code Online (Sandbox Code Playgroud)
当我双击exe时,它似乎没有抛出异常(StackOverFlowException),并且永远保持运行.
使用visual studio命令提示符2010,但我也在系统上安装了vs 2012,都是最新的.