这段代码有什么问题:
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,都是最新的.
在编译我的解决方案时,我收到以下几个警告:
warning CS3016: Arrays as attribute arguments is not CLS-compliant
Run Code Online (Sandbox Code Playgroud)
没有给出关于哪种类型不合规的其他信息.在我的项目中,我有一些属性在其构造函数中使用params数组参数,但它们都是内部的,并且不应该影响CLS兼容性.为什么要给出这个警告,它是什么类型的?
同时针对2.0,3.0,3.5,4.0和4.5的单个.NET程序集如何支持C#和VB.NET使用者的扩展方法?
标准建议是添加:
namespace System.Runtime.CompilerServices
{
public sealed class ExtensionAttribute : Attribute { }
}
Run Code Online (Sandbox Code Playgroud)
这种做法被认为更比一个微软员工,并甚至在特色MSDN杂志.它被许多博主广泛称赞为"没有不良影响".
哦,除了它会导致针对.NET 3.5或更高版本的VB.NET项目的编译器错误.
Microsoft.Core.Scripting.dll的作者发现了这一点,并将"公共"改为"内部".
namespace System.Runtime.CompilerServices
{
internal sealed class ExtensionAttribute : Attribute { }
}
Run Code Online (Sandbox Code Playgroud)
这似乎解决了VB兼容性问题.
因此,我信任地将该方法用于广泛使用的ImageResizing.Net库的最新版本(3.2.1).
但是随后,我们开始收到此编译器错误(原报告),或多或少随机,对某些用户针对.NET 3.5+.
Error 5 Missing compiler required member
'System.Runtime.CompilerServices.ExtensionAttribute..ctor'
Run Code Online (Sandbox Code Playgroud)
因为MSBuild/VisualStudio编译器在解决命名冲突时显然不打算查看范围规则,并且程序集引用的顺序扮演一个不完全文档化的角色,所以我不完全理解为什么以及何时发生这种情况.
这里有几个哈克变通办法,如改变程序集命名空间,重新创建项目文件,删除/ readding System.Core程序,并与.NET Framework的目标版本摆弄.不幸的是,这些变通方法都不是100%(除了别名,但这是一种令人无法接受的痛苦).
我怎样才能解决这个问题
或者,是否有一个修补程序使编译器注意范围规则?
关于SO的相关问题没有回答这个问题
我听说在Release模式下编译生成的优化代码比在Debug模式下生成,这很好.
但这是IL的优化吗?一旦CLR运行它,它在机器代码中吗?是否与在Release和Debug中编译的PE不同的元数据结构?
谢谢
我发现使用Visual Studio开发了一个不愉快的行为.在编译C#时它挂起了我的机器.
我已经减少了对下一个最小源代码的行为
using System.Collections.Generic;
using System.Linq;
namespace memoryOverflowCsharpCompiler {
class SomeType { public decimal x; }
class TypeWrapper : Dictionary<int,
Dictionary<int,
Dictionary<int, SomeType [] []>>> {
public decimal minimumX() {
return base.Values.Min(a =>
a.Values.Min(b =>
b.Values.Min(c =>
c .Sum(d =>
d .Sum(e => e.x)))));
}
}
}
Run Code Online (Sandbox Code Playgroud)
用.编译
PROMPT> csc source.cs
*** BANG! overflow memory usage (up to ~3G)
PROMPT> csc /?
Microsoft (R) Visual C# Compiler version 12.0.30501.0
Copyright (C) Microsoft Corporation. All rights reserved.
...
Run Code Online (Sandbox Code Playgroud)
(使用Windows 8.1 …
我正在尝试c#使用一个简单的程序Growl C# API.
我尝试用两种不同的方式编译我的程序:
1)我将.dll文件保存在与文件相同的目录中.cs.比我跑
csc /r:Growl.Connector.dll,Growl.CoreLibrary.dll /out:test.exe *.cs
Run Code Online (Sandbox Code Playgroud)
它编译得很好,也运行良好.
2)现在我在当前工作目录中创建了一个名为的目录,growl并保存了我的所有.dll引用.
现在,当我尝试使用以下命令编译它时
csc /r:"D:\Modified\Growl_NET_Connector_SDK\libraries\growl\Growl.Connector.dll","D:
\Modified\Growl_NET_Connector_SDK\libraries\growl\Growl.CoreLibrary.dll" /out:test.exe *.cs
Run Code Online (Sandbox Code Playgroud)
它编译得很好,但是当我试图运行它时,发生了下面提到的异常.
Unhandled Exception: System.IO.FileNotFoundException: Could not load file or assembly 'Growl.Connector, Version=2.0.0.0, Culture=n
eutral, PublicKeyToken=980c2339411be384' or one of its dependencies. The system cannot find the file specified.
at GrowlNotification.Program.Main(String[] args)
Run Code Online (Sandbox Code Playgroud)
所以,我的问题是当文件在外部文件夹.dll中csc时引用文件的正确方法是什么.
这是第二种情况的目录结构.
该解决方案包括两个项目:main.csproj和helper.csproj.
我喜欢做的是使用dll哪个helper项目将被编译,作为嵌入式资源main.dll.
为此目的,为项目添加自定义编译属性似乎是合理的main:/resource: <path to dll>.
问题是我找不到如何通过Project Property添加此编译参数.
PS也许有人可以建议其他解决方案,以避免在编译过程中进行更改.
我有一个简单的测试控制台应用程序。它唯一的代码是
public class Class1
{
private protected int _value = 0b_1001_0110;
}
Run Code Online (Sandbox Code Playgroud)
这只是测试这些C#7.2功能是否可以构建。
在Visual Studio 2017 15.5.2中,如果我这样设置语言版本,它们可以正常构建
如果我现在将项目检入VSTS并运行构建,它将失败,并显示各种错误,例如
Test \ CSharp72Test \ CSharp72Test \ Class1.cs(7,17):错误CS0107:多个保护修饰符
Test \ CSharp72Test \ CSharp72Test \ Class1.cs(7,40):错误CS1013:无效的数字
因为它对C#7一无所知。
如果我现在添加“ Microsoft.NET.Compilers 2.6.1” NuGet软件包并对其进行重建,则该软件包在本地可以正常运行,但在VSTS中使用
Test \ CSharp72Test \ CSharp72Test \ Class1.cs(7,40):错误CS8107:功能“前导数字分隔符”在C#7.0中不可用。请使用7.2版或更高版本的语言。
现在使用的是正确版本的CSC.exe,但未传递/ langversion:latest。
在多项目解决方案中,如何在每个项目中正确传递此信息?
以下 C# 表达式会导致我的程序出现编译器错误:
$"Getting image from {location.IsLatitudeLongitude ? $"{location.Latitude} - {location.Longitude}" : location.Location}."
Run Code Online (Sandbox Code Playgroud)
难道不能像这样使用字符串插值吗?或者根本不可能做到这一点?
C# 编译器的 -publicsign 选项有什么作用?
此选项会导致编译器应用公钥但实际上并未对程序集进行签名
什么公钥?怎么申请?