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

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

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

吐槽一下,博客園久了沒有上,賬號(hào)沒了,重新申請(qǐng)一個(gè).

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)鍵字. 這個(gè)其實(shí)國(guó)外大神已經(jīng)有源碼放出來了,我們把代碼直接引入cefsharp 這個(gè)工程. 就可以直接在4.0里使用 async/await;

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

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

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

以上是要點(diǎn).下面貼源碼:

本段源碼是對(duì):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);
 }
 }
}

這段是對(duì) Task 的擴(kuò)展

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 的時(shí)候,替換成 TaskEx.Run,遇到 Task.Delay 替換為TaskEx.Delay.

還有報(bào) GetTypeInfo 這個(gè)錯(cuò)誤的地方,刪之就Ok了。

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

相關(guān)文章

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

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

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

    asp.net 因?yàn)閿?shù)據(jù)庫正在使用的解決方法

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

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

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

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

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

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

    HTTP 錯(cuò)誤 500.19 - Internal Server Error 無法訪問請(qǐng)求的頁面,因?yàn)樵擁摰南嚓P(guān)配置數(shù)據(jù)無效
    2013-06-06
  • Entity Framework使用LINQ操作實(shí)體

    Entity Framework使用LINQ操作實(shí)體

    本文詳細(xì)講解了Entity Framework使用LINQ操作實(shí)體的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    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ù)的后端程序都有報(bào)表功能:把顯示在Grid中的數(shù)據(jù)導(dǎo)出到Excel文件中,這篇文章中使用的是EPPlus組件。需要的朋友可以參考借鑒
    2016-12-12
  • WPF自定義Expander控件樣式實(shí)現(xiàn)酷炫Style

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

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

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

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

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

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

最新評(píng)論

阜南县| 蕉岭县| 游戏| 淮安市| 武宣县| 尉氏县| 吉安市| 闸北区| 页游| 邵阳市| 山西省| 龙里县| 许昌县| 乌拉特前旗| 赤水市| 靖宇县| 门源| 石景山区| 兰考县| 铜梁县| 呼伦贝尔市| 阿拉尔市| 临朐县| 达日县| 砀山县| 鹿邑县| 嘉祥县| 西吉县| 岐山县| 斗六市| 大荔县| 黑河市| 佳木斯市| 韶山市| 通城县| 丰都县| 宜州市| 庆阳市| 侯马市| 洞口县| 读书|