标签: clr

尝试抓住加速我的代码?

我写了一些代码来测试try-catch的影响,但看到了一些令人惊讶的结果.

static void Main(string[] args)
{
    Thread.CurrentThread.Priority = ThreadPriority.Highest;
    Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.RealTime;

    long start = 0, stop = 0, elapsed = 0;
    double avg = 0.0;

    long temp = Fibo(1);

    for (int i = 1; i < 100000000; i++)
    {
        start = Stopwatch.GetTimestamp();
        temp = Fibo(100);
        stop = Stopwatch.GetTimestamp();

        elapsed = stop - start;
        avg = avg + ((double)elapsed - avg) / i;
    }

    Console.WriteLine("Elapsed: " + avg);
    Console.ReadKey();
}

static long Fibo(int n)
{
    long n1 = 0, n2 …
Run Code Online (Sandbox Code Playgroud)

.net c# clr try-catch performance-testing

1463
推荐指数
5
解决办法
10万
查看次数

解决MSB3247 - 发现同一依赖程序集的不同版本之间存在冲突

在使用msbuild进行编译时,.NET 3.5解决方案最终出现此警告.

有时NDepend可能有所帮助,但在这种情况下,它没有提供任何进一步的细节.像Bob一样,我最终不得不在ILDASM中打开每个程序集,直到找到引用旧版依赖程序集的程序集.

我确实尝试使用VS 2010 Beta 2中的MSBUILD(因为Connect文章表明这​​已经在下一版本的CLR中得到修复)但是它没有提供任何更多细节(可能在Beta 2后修复)

有更好的(更自动化的)方法吗?

.net msbuild clr ndepend

422
推荐指数
7
解决办法
19万
查看次数

使用CLR中的'as'关键字进行转换

在编程接口时,我发现我正在进行大量的转换或对象类型转换.

这两种转换方法有区别吗?如果是,是否有成本差异或这对我的计划有何影响?

public interface IMyInterface
{
    void AMethod();
}

public class MyClass : IMyInterface
{
    public void AMethod()
    {
       //Do work
    }

    // Other helper methods....
}

public class Implementation
{
    IMyInterface _MyObj;
    MyClass _myCls1;
    MyClass _myCls2;

    public Implementation()
    {
        _MyObj = new MyClass();

        // What is the difference here:
        _myCls1 = (MyClass)_MyObj;
        _myCls2 = (_MyObj as MyClass);
    }
}
Run Code Online (Sandbox Code Playgroud)

另外,什么是"一般"首选方法?

c# clr casting

377
推荐指数
7
解决办法
7万
查看次数

在C#中,为什么String是一个行为类似值的引用类型?

String是一种引用类型,即使它具有值类型的大多数特性,例如是不可变的并且具有==重载以比较文本而不是确保它们引用相同的对象.

为什么字符串不是一个值类型呢?

c# string clr value-type reference-type

348
推荐指数
8
解决办法
16万
查看次数

"as"和可空类型的性能惊喜

我刚刚修改了深度C#的第4章,它处理了可空类型,我正在添加一个关于使用"as"运算符的部分,它允许你编写:

object o = ...;
int? x = o as int?;
if (x.HasValue)
{
    ... // Use x.Value in here
}
Run Code Online (Sandbox Code Playgroud)

我认为这非常简洁,它可以提高性能而不是C#1等效,使用"is"后跟一个演员 - 毕竟,这样我们只需要请求动态类型检查一次,然后进行简单的值检查.

然而,情况似乎并非如此.我在下面包含了一个示例测试应用程序,它基本上对对象数组中的所有整数求和 - 但该数组包含许多空引用和字符串引用以及盒装整数.该基准测试您必须在C#1中使用的代码,使用"as"运算符的代码,以及用于踢LINQ解决方案的代码.令我惊讶的是,在这种情况下,C#1代码的速度提高了20倍 - 即使是LINQ代码(考虑到所涉及的迭代器,我预计它会更慢)也胜过"as"代码.

可以isinst为空的类型的.NET实现真的很慢吗?是unbox.any导致问题的附加因素吗?还有另一种解释吗?目前,我觉得我必须在性能敏感的情况下包含警告,禁止使用它...

结果:

演员:10000000:121
As:10000000:2211
LINQ:10000000:2143

码:

using System;
using System.Diagnostics;
using System.Linq;

class Test
{
    const int Size = 30000000;

    static void Main()
    {
        object[] values = new object[Size];
        for (int i = 0; i < Size - 2; i += 3)
        {
            values[i] = null;
            values[i+1] …
Run Code Online (Sandbox Code Playgroud)

c# clr performance unboxing nullable

326
推荐指数
10
解决办法
3万
查看次数

.NET中API破坏性更改的权威指南

我想尽可能多地收集有关.NET/CLR中API版本控制的信息,特别是API更改如何破坏客户端应用程序.首先,让我们定义一些术语:

API更改 - 类型的公开可见定义的更改,包括其任何公共成员.这包括更改类型和成员名称,更改类型的基本类型,从类型的已实现接口列表添加/删除接口,添加/删除成员(包括重载),更改成员可见性,重命名方法和类型参数,添加默认值对于方法参数,在类型和成员上添加/删除属性,以及在类型和成员上添加/删除泛型类型参数(我错过了什么吗?).这不包括成员团体的任何变化,或私人成员的任何变化(即我们不考虑反射).

二进制级别中断 - 一种API更改,导致针对旧版本API编译的客户端程序集可能无法加载新版本.示例:更改方法签名,即使它允许以与之前相同的方式调用(即:void返回类型/参数默认值重载).

源级别中断 - 一种API更改,导致编写现有代码以针对旧版本的API进行编译,可能无法使用新版本进行编译.然而,已经编译的客户端程序集像以前一样工作.示例:添加一个新的重载,这可能导致前一个明确的方法调用不明确.

源级安静语义更改 - 一种API更改导致编写的现有代码针对旧版API进行编译,从而悄然改变其语义,例如通过调用不同的方法.但是,代码应该继续编译而不会出现警告/错误,以前编译的程序集应该像以前一样工作.示例:在现有类上实现新接口,导致在重载解析期间选择不同的重载.

最终目标是尽可能地对尽可能多的破坏和静默语义API更改进行编目,并描述破坏的确切影响,以及哪些语言受其影响并且不受其影响.扩展后者:虽然一些变化普遍影响所有语言(例如,向接口添加新成员将破坏任何语言中该接口的实现),但有些需要非常特定的语言语义才能进入游戏以获得休息.这通常涉及方法重载,并且通常涉及与隐式类型转换有关的任何事情.似乎没有任何方法可以在这里定义"最小公分母",即使对于符合CLS的语言(即至少符合CLI规范中定义的"CLS使用者"规则的那些语言) - 尽管我会很感激,如果有人在这里纠正我错了 - 所以这必须按语言去语言.那些最感兴趣的东西自然就是开箱即用的.NET:C#,VB和F#; 但其他人,如IronPython,IronRuby,Delphi Prism等也是相关的.它的角落越多,它就越有趣 - 删除成员之类的东西是不言而喻的,但是例如方法重载,可选/默认参数,lambda类型推断和转换运算符之间的微妙交互可能会非常令人惊讶有时.

举几个例子来启动这个:

添加新方法重载

种类:源级休息

受影响的语言:C#,VB,F#

更改前的API:

public class Foo
{
    public void Bar(IEnumerable x);
}
Run Code Online (Sandbox Code Playgroud)

更改后的API:

public class Foo
{
    public void Bar(IEnumerable x);
    public void Bar(ICloneable x);
}
Run Code Online (Sandbox Code Playgroud)

示例客户端代码在更改之前工作并在其之后中断:

new Foo().Bar(new int[0]);
Run Code Online (Sandbox Code Playgroud)

添加新的隐式转换运算符重载

种类:源级休息.

受影响的语言:C#,VB

语言不受影响:F#

更改前的API:

public class Foo
{
    public static implicit operator int ();
}
Run Code Online (Sandbox Code Playgroud)

更改后的API:

public class Foo
{
    public static implicit operator int …
Run Code Online (Sandbox Code Playgroud)

.net versioning api clr cls-compliant

219
推荐指数
10
解决办法
3万
查看次数

C#和Java有什么主要区别?

我只想澄清一件事.这不是一个更好的问题,我要留给其他人讨论.我不在乎.在我的求职面试中,我被问到这个问题,我认为学习更多内容可能会有所帮助.

这些是我能想到的:

  • Java是"独立于平台的".那么现在你可以说有Mono项目,所以C#也可以考虑,但我相信它有点夸张.为什么?那么,当Java的新版本完成时,它同时可以在它支持的所有平台上使用,另一方面,Mono实现中仍然缺少多少C#3.0功能?或者我们应该在这里比较真正的CLRJRE吗?
  • Java不支持事件和委托.我所知道的.
  • 在Java中,所有方法都是虚拟的
  • 开发工具:我相信还没有像Visual Studio这样的工具.特别是如果你使用团队版本,你就会知道我的意思.

请添加您认为相关的其他人.

更新:刚刚弹出我的想法,Java没有像类,方法等的自定义属性那样的东西.或者它呢?

.net c# java clr

209
推荐指数
6
解决办法
18万
查看次数

你在MSIL中可以做些什么,你不能用C#或VB.NET做什么?

用.NET语言编写的所有代码都编译为MSIL,但是只有使用MSIL才能直接执行特定的任务/操作吗?

让我们在MSIL中比C#,VB.NET,F#,j#或任何其他.NET语言更容易完成.

到目前为止我们有这个:

  1. 尾递归
  2. 通用Co/Contravariance
  3. 重载仅在返回类型上有所不同
  4. 覆盖访问修饰符
  5. 有一个不能从System.Object继承的类
  6. 过滤的异常(可以在vb.net中完成)
  7. 调用当前静态类类型的虚方法.
  8. 获取值类型的盒装版本的句柄.
  9. 做一个尝试/错误.
  10. 使用禁用名称.
  11. 为值类型定义自己的无参数构造函数.
  12. 使用raise元素定义事件.
  13. CLR允许一些转换,但C#不允许转换.
  14. 做一个非main()方法作为.entrypoint.
  15. 直接使用本机int和本机unsigned int类型.
  16. 玩瞬态指针
  17. MethodBodyItem中的emitbyte指令
  18. 抛出并捕获非System.Exception类型
  19. 继承枚举(未验证)
  20. 您可以将字节数组视为(4x更小)整数数组.
  21. 您可以使字段/方法/属性/事件具有相同的名称(未验证).
  22. 您可以从自己的catch块分支回try块.
  23. 您可以访问famandassem访问说明符(protected internal是fam assem)
  24. 直接访问<Module>类以定义全局函数或模块初始值设定项.

.net c# clr cil

161
推荐指数
13
解决办法
9231
查看次数

.NET 4.5 beta中FatalExecutionEngineError的原因是什么?

以下示例代码自然发生.突然间,我的代码成了一个非常令人讨厌的FatalExecutionEngineError异常.我花了30分钟试图隔离并最小化罪魁祸首样本.使用Visual Studio 2012作为控制台应用程序对此进行编译:

class A<T>
{
    static A() { }

    public A() { string.Format("{0}", string.Empty); }
}

class B
{
    static void Main() { new A<object>(); }
}
Run Code Online (Sandbox Code Playgroud)

应该在.NET framework 4和4.5上产生此错误:

FatalExecutionException截图

这是一个已知的错误,原因是什么,我可以做些什么来减轻它?我目前的工作是不使用string.Empty,但我是在吠叫错误的树吗?更改有关该代码的任何内容使其按预期运行 - 例如删除空的静态构造函数A,或将类型参数更改objectint.

我在笔记本电脑上尝试了这个代码并没有抱怨.但是,我确实尝试了我的主应用程序,它也在笔记本电脑上崩溃了.在减少问题的时候,我必须把一些东西弄错了,我会看看能否弄清楚那是什么.

我的笔记本电脑使用与上面相同的代码崩溃,使用框架4.0,但主要崩溃,即使是4.5.两个系统都使用VS'12和最新更新(7月?).

更多信息:

  • IL代码(已编译的Debug/Any CPU/4.0/VS2010(不是那个IDE应该重要吗?)):http://codepad.org/boZDd98E
  • 没有看到VS 2010与4.0.没有/没有优化,不同的目标CPU,附加/未附加的调试器等崩溃 - Tim Medora
  • 如果我使用AnyCPU,2010年崩溃,在x86中很好.使用Platform Target = AnyCPU在Visual Studio 2010 SP1中崩溃,但在Platform Target = x86时很好.这台机器也安装了VS2012RC,因此4.5可以进行就地更换.使用AnyCPU和TargetPlatform = 3.5然后它不会崩溃所以看起来像Framework中的回归.- colinsmith
  • 无法在带有4.0的VS2010中的x86,x64或AnyCPU上重现.- 富士
  • 只发生在x64,(2012rc,Fx4.5) - Henk Holterman
  • Win8 RP上的VS2012 …

c# clr

150
推荐指数
1
解决办法
1万
查看次数

在调试器中正确地使.NET语言步进

首先,我为这个问题的长度道歉.

我是IronScheme的作者.最近我一直在努力发出不错的调试信息,以便我可以使用'native'.NET调试器.

虽然这部分成功,但我遇到了一些问题.

第一个问题与踩踏有关.

由于Scheme是一种表达式语言,一切都倾向于用括号括起来,不像主要的.NET语言似乎是基于语句(或行).

原始代码(Scheme)看起来像:

(define (baz x)
  (cond
    [(null? x) 
      x]
    [(pair? x) 
      (car x)]
    [else
      (assertion-violation #f "nooo" x)]))
Run Code Online (Sandbox Code Playgroud)

我故意在换行符上列出每个表达式.

发出的代码转换为C#(通过ILSpy),如下所示:

public static object ::baz(object x)
{
  if (x == null)
  {
    return x;
  }
  if (x is Cons)
  {
    return Builtins.Car(x);
  }
  return #.ironscheme.exceptions::assertion-violation+(
     RuntimeHelpers.False, "nooo", Builtins.List(x));
}
Run Code Online (Sandbox Code Playgroud)

如你所见,非常简单.

注意:如果代码在C#中转换为条件表达式(?:),那么整个过程只需要一个调试步骤,请记住这一点.

这是带有源和行号的IL输出:

  .method public static object  '::baz'(object x) cil managed
  {
    // Code size       56 (0x38)
    .maxstack  6
    .line 15,15 : 1,2 ''
//000014: 
//000015: …
Run Code Online (Sandbox Code Playgroud)

.net debugging clr visual-studio-2010 visual-studio

134
推荐指数
1
解决办法
3703
查看次数