欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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.沒辦法啊,自己拿源碼修改兼容唄.

仔細分析源碼發(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)文章

  • .NET 5 部署在docker上運行的方法

    .NET 5 部署在docker上運行的方法

    這篇文章主要介紹了.NET 5 部署在docker上運行的方法,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • asp.net實現(xiàn)DropDownList,TreeView,ListBox的無限極分類目錄樹

    asp.net實現(xiàn)DropDownList,TreeView,ListBox的無限極分類目錄樹

    這篇文章主要介紹了asp.net實現(xiàn)DropDownList,TreeView,ListBox的無限極分類目錄樹,結(jié)合實例形式較為詳細的分析了asp.net常見控件實現(xiàn)無限極分類目錄樹的具體實現(xiàn)步驟與相關(guān)操作技巧,需要的朋友可以參考下
    2016-06-06
  • .net前臺調(diào)用后臺函數(shù)的簡單實例

    .net前臺調(diào)用后臺函數(shù)的簡單實例

    這篇文章介紹了.net前臺調(diào)用后臺函數(shù)的簡單實例,有需要的朋友可以參考一下
    2013-09-09
  • ASP.NET Core自定義中間件如何讀取Request.Body與Response.Body的內(nèi)容詳解

    ASP.NET Core自定義中間件如何讀取Request.Body與Response.Body的內(nèi)容詳解

    這篇文章主要給大家介紹了關(guān)于在ASP.NET Core自定義中間件中如何讀取Request.Body與Response.Body的內(nèi)容,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用ASP.NET Core具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • asp.net core webapi 服務(wù)端配置跨域的實例

    asp.net core webapi 服務(wù)端配置跨域的實例

    下面小編就為大家分享一篇asp.net core webapi 服務(wù)端配置跨域的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12
  • 利用Builder方式創(chuàng)建對象示例代碼

    利用Builder方式創(chuàng)建對象示例代碼

    這篇文章主要給大家介紹了關(guān)于利用Builder方式創(chuàng)建對象的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • ASP.NET下使用xml反序列化、緩存依賴實現(xiàn)個性化配置文件的實時生效

    ASP.NET下使用xml反序列化、緩存依賴實現(xiàn)個性化配置文件的實時生效

    本文主要介紹了ASP.NET下使用xml反序列化、緩存依賴實現(xiàn)個性化配置文件的實時生效的方法。具有一定的參考價值,下面跟著小編一起來看下吧
    2017-01-01
  • ASP.NET Core Project.json文件(5)

    ASP.NET Core Project.json文件(5)

    這篇文章主要為大家詳細介紹了ASP.NET Core Project.json文件,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • 使用Ajax更新ASP.Net MVC項目中的報表對象方法

    使用Ajax更新ASP.Net MVC項目中的報表對象方法

    下面小編就為大家分享一篇使用Ajax更新ASP.Net MVC項目中的報表對象方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • .NET發(fā)送郵件的實現(xiàn)方法示例

    .NET發(fā)送郵件的實現(xiàn)方法示例

    這篇文章主要給大家介紹了關(guān)于.NET發(fā)送郵件的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用.net具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-06-06

最新評論