【问题标题】:Looking for .NET 4.5 Progress<T> source code寻找 .NET 4.5 Progress<T> 源代码
【发布时间】:2012-05-25 07:51:18
【问题描述】:

我没有安装 .NET 4.5(也无法安装)。

在哪里可以找到新的System.Progress&lt;T&gt; 类的源代码?

(或者安装 .NET 4.5 beta 的好心人,复制/粘贴代码)

【问题讨论】:

  • 安装 4.5,安装反射器演示或 ilspy 等等...
  • 我知道,但我无法安装它(我已经编辑了我的问题)
  • 超级要求...大声笑...没有机会让您可以(ab)使用任何其他计算机?
  • 很可能正在寻找作业调度程序。在这种情况下可能Quartz.NET可以帮助你。
  • 顺便说一句-您可以将您的视觉工作室链接到符号服务器并逐步执行..

标签: c# .net-4.5


【解决方案1】:

如果您对原始源代码感兴趣,Microsoft 已将其提供在 Internet 上。 Progress 类的源代码可以在这里找到:

https://referencesource.microsoft.com/#mscorlib/system/progress.cs

【讨论】:

    【解决方案2】:

    这是 ILSpy 的输出:

    using System;
    using System.Runtime;
    using System.Threading;
    namespace System
    {
        [__DynamicallyInvokable]
        public class Progress<T> : IProgress<T>
        {
            private readonly SynchronizationContext m_synchronizationContext;
            private readonly Action<T> m_handler;
            private readonly SendOrPostCallback m_invokeHandlers;
            [__DynamicallyInvokable]
            public event EventHandler<T> ProgressChanged
            {
                [__DynamicallyInvokable]
                add
                {
                    EventHandler<T> eventHandler = this.ProgressChanged;
                    EventHandler<T> eventHandler2;
                    do
                    {
                        eventHandler2 = eventHandler;
                        EventHandler<T> value2 = (EventHandler<T>)Delegate.Combine(eventHandler2, value);
                        eventHandler = Interlocked.CompareExchange<EventHandler<T>>(ref this.ProgressChanged, value2, eventHandler2);
                    }
                    while (eventHandler != eventHandler2);
                }
                [__DynamicallyInvokable]
                remove
                {
                    EventHandler<T> eventHandler = this.ProgressChanged;
                    EventHandler<T> eventHandler2;
                    do
                    {
                        eventHandler2 = eventHandler;
                        EventHandler<T> value2 = (EventHandler<T>)Delegate.Remove(eventHandler2, value);
                        eventHandler = Interlocked.CompareExchange<EventHandler<T>>(ref this.ProgressChanged, value2, eventHandler2);
                    }
                    while (eventHandler != eventHandler2);
                }
            }
            [__DynamicallyInvokable]
            public Progress()
            {
                this.m_synchronizationContext = (SynchronizationContext.CurrentNoFlow ?? ProgressStatics.DefaultContext);
                this.m_invokeHandlers = new SendOrPostCallback(this.InvokeHandlers);
            }
            [__DynamicallyInvokable]
            public Progress(Action<T> handler) : this()
            {
                if (handler == null)
                {
                    throw new ArgumentNullException("handler");
                }
                this.m_handler = handler;
            }
            [__DynamicallyInvokable]
            protected virtual void OnReport(T value)
            {
                Action<T> handler = this.m_handler;
                EventHandler<T> progressChanged = this.ProgressChanged;
                if (handler != null || progressChanged != null)
                {
                    this.m_synchronizationContext.Post(this.m_invokeHandlers, value);
                }
            }
            [__DynamicallyInvokable, TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
            void IProgress<T>.Report(T value)
            {
                this.OnReport(value);
            }
            private void InvokeHandlers(object state)
            {
                T t = (T)((object)state);
                Action<T> handler = this.m_handler;
                EventHandler<T> progressChanged = this.ProgressChanged;
                if (handler != null)
                {
                    handler(t);
                }
                if (progressChanged != null)
                {
                    progressChanged(this, t);
                }
            }
        }
    }
    

    【讨论】:

      【解决方案3】:

      下载.NET Framework version 4.5 并将其安装在您的PC 上。然后获取dotPeek 之类的副本,并使用它来查看 Progress 的源代码。

      http://www.microsoft.com/en-us/download/details.aspx?id=8483

      http://www.jetbrains.com/decompiler/

      【讨论】:

      • 嗯嗯好的。唯一的选择是使用另一台可以安装它的 PC。尽管 .NET 源代码可用,但您不能像公共存储库一样简单地浏览它。您需要使用 .NET Reflector 或 dotPeek 之类的东西,甚至在配置为这样做时使用 Visual Studio 本身来下载 .NET 框架的符号。这将允许您查看源代码。
      • 我期待安装 .NET 4.5 的人为我执行此操作,因为我没有 .NET 4.5。我无法安装它,因为它覆盖了 .NET 4
      • 即使安装了 .NET 4.5,您也可以定位 .NET 4.0,@bbaia。
      【解决方案4】:

      取自 ReSharper Decompiler 的源代码:

      // Decompiled with JetBrains decompiler
      // Type: System.Progress`1
      // Assembly: mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
      // MVID: 85AB3664-E4CA-41A0-86E3-96342ED95AAA
      // Assembly location: C:\Windows\Microsoft.NET\Framework\v4.0.30319\mscorlib.dll
      
      using System.Threading;
      
      namespace System
      {
        /// <summary>Provides an <see cref="T:System.IProgress`1" /> that invokes callbacks for each reported progress value.</summary>
        /// <typeparam name="T">Specifies the type of the progress report value.</typeparam>
        [__DynamicallyInvokable]
        public class Progress<T> : IProgress<T>
        {
          private readonly SynchronizationContext m_synchronizationContext;
          private readonly Action<T> m_handler;
          private readonly SendOrPostCallback m_invokeHandlers;
      
          /// <summary>Raised for each reported progress value.</summary>
          [__DynamicallyInvokable]
          public event EventHandler<T> ProgressChanged;
      
          /// <summary>Initializes the <see cref="T:System.Progress`1" /> object.</summary>
          [__DynamicallyInvokable]
          public Progress()
          {
            this.m_synchronizationContext = SynchronizationContext.CurrentNoFlow ?? ProgressStatics.DefaultContext;
            this.m_invokeHandlers = new SendOrPostCallback(this.InvokeHandlers);
          }
      
          /// <summary>Initializes the <see cref="T:System.Progress`1" /> object with the specified callback.</summary>
          /// <param name="handler">A handler to invoke for each reported progress value. This handler will be invoked in addition to any delegates registered with the <see cref="E:System.Progress`1.ProgressChanged" /> event. Depending on the <see cref="T:System.Threading.SynchronizationContext" /> instance captured by the <see cref="T:System.Progress`1" /> at construction, it is possible that this handler instance could be invoked concurrently with itself.</param>
          [__DynamicallyInvokable]
          public Progress(Action<T> handler)
            : this()
          {
            if (handler == null)
              throw new ArgumentNullException("handler");
            this.m_handler = handler;
          }
      
          /// <summary>Reports a progress change.</summary>
          /// <param name="value">The value of the updated progress.</param>
          [__DynamicallyInvokable]
          protected virtual void OnReport(T value)
          {
            // ISSUE: reference to a compiler-generated field
            if (this.m_handler == null && this.ProgressChanged == null)
              return;
            this.m_synchronizationContext.Post(this.m_invokeHandlers, (object) value);
          }
      
          [__DynamicallyInvokable]
          void IProgress<T>.Report(T value)
          {
            this.OnReport(value);
          }
      
          private void InvokeHandlers(object state)
          {
            T e = (T) state;
            Action<T> handler = this.m_handler;
            // ISSUE: reference to a compiler-generated field
            EventHandler<T> progressChanged = this.ProgressChanged;
            if (handler != null)
              handler(e);
            if (progressChanged == null)
              return;
            progressChanged((object) this, e);
          }
        }
      }
      

      【讨论】:

        猜你喜欢
        • 2011-05-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-30
        • 1970-01-01
        • 1970-01-01
        • 2011-06-10
        • 1970-01-01
        相关资源
        最近更新 更多