最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

CefSharp v62修改方法(支持.net4.0)

 更新時間:2017年12月18日 14:10:20   作者:不不不不  
下面小編就為大家分享一篇CefSharp v62修改方法(支持.net4.0),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

吐槽一下,博客園久了沒有上,賬號沒了,重新申請一個.

cesharp v62版本,內(nèi)核采用最新的Cef 62,支持最新的Grid布局. 由于官方的cefsharp 采用.net4.5.2開發(fā).怎么辦怎么辦.我只能用.net4.0.沒辦法啊,自己拿源碼修改兼容唄.

仔細(xì)分析源碼發(fā)現(xiàn):

1.net4.5.2 引入了 async/await 關(guān)鍵字. 這個其實國外大神已經(jīng)有源碼放出來了,我們把代碼直接引入cefsharp 這個工程. 就可以直接在4.0里使用 async/await;

2.net4.5 對task api 做了擴展, 我們只需要在.net4.0實現(xiàn)一下對應(yīng)的api.就可以了.

3. 源碼里面用了很多4.5才有的GetTypeInfo 擴展方法錯誤. 它返回的類型是typeinfo,不用管它,把GetTypeInfo 刪掉. 直接Type 調(diào)用就可以了.

4. 對Task靜態(tài)方法的擴展,需要修改一下,靜態(tài)方法的調(diào)用方式.

以上是要點.下面貼源碼:

本段源碼是對:async/await的支持:

namespace System.Threading.Tasks
{
 public static class TaskEx
 {
 public static TaskAwaiter GetAwaiter(this Task task)
 {
  return new TaskAwaiter(task);
 }
 public static TaskAwaiter<T> GetAwaiter<T>(this Task<T> task)
 {
  return new TaskAwaiter<T>(task);
 }
 }
 public struct TaskAwaiter : INotifyCompletion
 {
 readonly Task task;
 internal TaskAwaiter(Task task)
 {
  this.task = task;
 }
 internal static TaskScheduler TaskScheduler
 {
  get
  {
  if (SynchronizationContext.Current == null)
   return TaskScheduler.Default;
  else
   return TaskScheduler.FromCurrentSynchronizationContext();
  }
 }
 public bool IsCompleted
 {
  get { return task.IsCompleted; }
 }
 public void OnCompleted(Action continuation)
 {
  this.task.ContinueWith(
  delegate (Task task) {
   continuation();
  }, TaskAwaiter.TaskScheduler);
 }
 public void GetResult()
 {
  try
  {
  task.Wait();
  }
  catch (AggregateException ex)
  {
  throw ex.InnerExceptions[0];
  }
 }
 }
 public struct TaskAwaiter<T> : INotifyCompletion
 {
 readonly Task<T> task;
 internal TaskAwaiter(Task<T> task)
 {
  this.task = task;
 }
 public bool IsCompleted
 {
  get { return task.IsCompleted; }
 }
 public void OnCompleted(Action continuation)
 {
  this.task.ContinueWith(
  delegate (Task<T> task) {
   continuation();
  }, TaskAwaiter.TaskScheduler);
 }
 public T GetResult()
 {
  try
  {
  return task.Result;
  }
  catch (AggregateException ex)
  {
  throw ex.InnerExceptions[0];
  }
 }
 }
}
namespace System.Runtime.CompilerServices
{
 public interface INotifyCompletion
 {
 void OnCompleted(Action continuation);
 }
 public interface ICriticalNotifyCompletion : INotifyCompletion
 {
 [SecurityCritical]
 void UnsafeOnCompleted(Action continuation);
 }
 public interface IAsyncStateMachine
 {
 void MoveNext();
 void SetStateMachine(IAsyncStateMachine stateMachine);
 }
 public struct AsyncVoidMethodBuilder
 {
 public static AsyncVoidMethodBuilder Create()
 {
  return new AsyncVoidMethodBuilder();
 }
 public void SetException(Exception exception)
 {
  throw exception;
 }
 public void SetResult()
 {
 }
 public void SetStateMachine(IAsyncStateMachine stateMachine)
 {
  // Should not get called as we don't implement the optimization that this method is used for.
  throw new NotImplementedException();
 }
 public void Start<TStateMachine>(ref TStateMachine stateMachine) where TStateMachine : IAsyncStateMachine
 {
  stateMachine.MoveNext();
 }
 public void AwaitOnCompleted<TAwaiter, TStateMachine>(ref TAwaiter awaiter, ref TStateMachine stateMachine) where TAwaiter : INotifyCompletion where TStateMachine : IAsyncStateMachine
 {
  awaiter.OnCompleted(stateMachine.MoveNext);
 }
 public void AwaitUnsafeOnCompleted<TAwaiter, TStateMachine>(ref TAwaiter awaiter, ref TStateMachine stateMachine) where TAwaiter : ICriticalNotifyCompletion where TStateMachine : IAsyncStateMachine
 {
  awaiter.OnCompleted(stateMachine.MoveNext);
 }
 }
 public struct AsyncTaskMethodBuilder
 {
 TaskCompletionSource<object> tcs;
 public Task Task { get { return tcs.Task; } }
 public static AsyncTaskMethodBuilder Create()
 {
  AsyncTaskMethodBuilder b;
  b.tcs = new TaskCompletionSource<object>();
  return b;
 }
 public void Start<TStateMachine>(ref TStateMachine stateMachine) where TStateMachine : IAsyncStateMachine
 {
  stateMachine.MoveNext();
 }
 public void SetStateMachine(IAsyncStateMachine stateMachine)
 {
  // Should not get called as we don't implement the optimization that this method is used for.
  throw new NotImplementedException();
 }
 public void AwaitOnCompleted<TAwaiter, TStateMachine>(ref TAwaiter awaiter, ref TStateMachine stateMachine) where TAwaiter : INotifyCompletion where TStateMachine : IAsyncStateMachine
 {
  awaiter.OnCompleted(stateMachine.MoveNext);
 }
 public void AwaitUnsafeOnCompleted<TAwaiter, TStateMachine>(ref TAwaiter awaiter, ref TStateMachine stateMachine) where TAwaiter : ICriticalNotifyCompletion where TStateMachine : IAsyncStateMachine
 {
  awaiter.OnCompleted(stateMachine.MoveNext);
 }
 public void SetResult()
 {
  tcs.SetResult(null);
 }
 public void SetException(Exception exception)
 {
  tcs.SetException(exception);
 }
 }
 public struct AsyncTaskMethodBuilder<T>
 {
 TaskCompletionSource<T> tcs;
 public Task<T> Task { get { return tcs.Task; } }
 public static AsyncTaskMethodBuilder<T> Create()
 {
  AsyncTaskMethodBuilder<T> b;
  b.tcs = new TaskCompletionSource<T>();
  return b;
 }
 public void Start<TStateMachine>(ref TStateMachine stateMachine) where TStateMachine : IAsyncStateMachine
 {
  stateMachine.MoveNext();
 }
 public void SetStateMachine(IAsyncStateMachine stateMachine)
 {
  // Should not get called as we don't implement the optimization that this method is used for.
  throw new NotImplementedException();
 }
 public void AwaitOnCompleted<TAwaiter, TStateMachine>(ref TAwaiter awaiter, ref TStateMachine stateMachine) where TAwaiter : INotifyCompletion where TStateMachine : IAsyncStateMachine
 {
  awaiter.OnCompleted(stateMachine.MoveNext);
 }
 public void AwaitUnsafeOnCompleted<TAwaiter, TStateMachine>(ref TAwaiter awaiter, ref TStateMachine stateMachine) where TAwaiter : ICriticalNotifyCompletion where TStateMachine : IAsyncStateMachine
 {
  AwaitOnCompleted(ref awaiter, ref stateMachine);
 }
 public void SetResult(T result)
 {
  tcs.SetResult(result);
 }
 public void SetException(Exception exception)
 {
  tcs.SetException(exception);
 }
 }
}

這段是對 Task 的擴展

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace CefSharp
{
 public class TaskEx
 {
 public static Task<T> FromResult<T>(T t)
 {
  return Task.Factory.StartNew<T>(() => t);
 }
 public static Task Run(Action action)
 {
  var tcs = new TaskCompletionSource<object>();
  new Thread(() => {
   try
   {
   action();
   tcs.SetResult(null);
   }
   catch (Exception ex)
   {
   tcs.SetException(ex);
   }
  })
  { IsBackground = true }.Start();
  return tcs.Task;
 }
 public static Task<TResult> Run<TResult>(Func<TResult> function)
 {
  var tcs = new TaskCompletionSource<TResult>();
  new Thread(() =>
  {
   try
   {
   tcs.SetResult(function());
   }
   catch (Exception ex)
   {
   tcs.SetException(ex);
   }
  })
  { IsBackground = true }.Start();
  return tcs.Task;
 }
 public static Task Delay(int milliseconds)
 {
  var tcs = new TaskCompletionSource<object>();
  var timer = new System.Timers.Timer(milliseconds) { AutoReset = false };
  timer.Elapsed += delegate { timer.Dispose(); tcs.SetResult(null); };
  timer.Start();
  return tcs.Task;
 }
 }
}

把在C#內(nèi)添加以上代碼里, 遇到 Task.Run 的時候,替換成 TaskEx.Run,遇到 Task.Delay 替換為TaskEx.Delay.

還有報 GetTypeInfo 這個錯誤的地方,刪之就Ok了。

以上這篇CefSharp v62修改方法(支持.net4.0)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • asp.net DropDownList自定義控件,讓你的分類更清晰

    asp.net DropDownList自定義控件,讓你的分類更清晰

    記得上次做論壇,一個功能就是合并2個子板塊的主題,用級聯(lián)的2個DropDownList也是可以完成,那樣我們要合并的時候總共就有4個DropDownList控件,覺得界面友好
    2011-10-10
  • asp.net 因為數(shù)據(jù)庫正在使用的解決方法

    asp.net 因為數(shù)據(jù)庫正在使用的解決方法

    因為數(shù)據(jù)庫正在使用,所以未能獲得對數(shù)據(jù)庫的排它訪問權(quán)?
    2009-02-02
  • asp.net后臺如何動態(tài)添加JS文件和css文件的引用

    asp.net后臺如何動態(tài)添加JS文件和css文件的引用

    動態(tài)添加JS文件和css文件的引用在asp.net后臺如何實現(xiàn)呢?首先添加命名空間 using System.Web.UI.HtmlControls,之后按照下面的步驟操作即可
    2014-09-09
  • .net如何優(yōu)雅的使用EFCore實例詳解

    .net如何優(yōu)雅的使用EFCore實例詳解

    這篇文章主要為大家介紹了.net如何優(yōu)雅的使用EFCore實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • HTTP錯誤500.19解決方法(定義了重復(fù)的節(jié)點)

    HTTP錯誤500.19解決方法(定義了重復(fù)的節(jié)點)

    HTTP 錯誤 500.19 - Internal Server Error 無法訪問請求的頁面,因為該頁的相關(guān)配置數(shù)據(jù)無效
    2013-06-06
  • Entity Framework使用LINQ操作實體

    Entity Framework使用LINQ操作實體

    本文詳細(xì)講解了Entity Framework使用LINQ操作實體的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03
  • ASP.NET MVC使用EPPlus,導(dǎo)出數(shù)據(jù)到Excel中

    ASP.NET MVC使用EPPlus,導(dǎo)出數(shù)據(jù)到Excel中

    這篇文章介紹的是怎樣導(dǎo)出數(shù)據(jù)到Excel文件中,大多數(shù)的后端程序都有報表功能:把顯示在Grid中的數(shù)據(jù)導(dǎo)出到Excel文件中,這篇文章中使用的是EPPlus組件。需要的朋友可以參考借鑒
    2016-12-12
  • WPF自定義Expander控件樣式實現(xiàn)酷炫Style

    WPF自定義Expander控件樣式實現(xiàn)酷炫Style

    這篇文章介紹了WPF自定義Expander控件樣式實現(xiàn)酷炫Style的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-01-01
  • Web.config(應(yīng)用程序的配置信息)總結(jié)

    Web.config(應(yīng)用程序的配置信息)總結(jié)

    Web.config文件是一個XML文本文件,它用來儲存 ASP.NET Web 應(yīng)用程序的配置信息(如最常用的設(shè)置ASP.NET Web 應(yīng)用程序的身份驗證方式),它可以出現(xiàn)在應(yīng)用程序的每一個目錄中,接下來詳細(xì)介紹一下配置情況,感興趣的朋友可以了解下
    2013-01-01
  • 總結(jié)十條.NET異常處理建議

    總結(jié)十條.NET異常處理建議

    .NET中從始至終要緊記異常處理的策略:拋出具體的一個異常,而不是只拋出Exception類型的異常,這樣能方便我們捕獲對應(yīng)類型的異常。我們在編寫代碼時要注意考慮到應(yīng)用程序最差的情況;顯示有好的信息,并提供適當(dāng)?shù)墓芾韱T聯(lián)系信息
    2015-11-11

最新評論

泉州市| 万安县| 桃园县| 成都市| 高碑店市| 丘北县| 额济纳旗| 留坝县| 东乌珠穆沁旗| 徐州市| 渑池县| 汕尾市| 丰县| 克山县| 敦化市| 海阳市| 铅山县| 鹤峰县| 米林县| 富民县| 恩施市| 景德镇市| 蓬安县| 资源县| 嘉义县| 麻江县| 衡南县| 政和县| 尼勒克县| 昂仁县| 浙江省| 柳林县| 囊谦县| 阳春市| 双辽市| 岳普湖县| 晋宁县| 虎林市| 仁寿县| 佳木斯市| 康马县|