国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當前位置: 首頁 - 科技 - 知識百科 - 正文

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

來源:懂視網 責編:小采 時間:2020-11-27 22:35:16
文檔

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

CefSharp v62修改方法(支持.net4.0):吐槽一下,博客園久了沒有上,賬號沒了,重新申請一個. cesharp v62版本,內核采用最新的Cef 62,支持最新的Grid布局. 由于官方的cefsharp 采用.net4.5.2開發.怎么辦怎么辦.我只能用.net4.0.沒辦法啊,自己拿源碼修改兼容唄. 仔細分析源碼發現: 1.ne
推薦度:
導讀CefSharp v62修改方法(支持.net4.0):吐槽一下,博客園久了沒有上,賬號沒了,重新申請一個. cesharp v62版本,內核采用最新的Cef 62,支持最新的Grid布局. 由于官方的cefsharp 采用.net4.5.2開發.怎么辦怎么辦.我只能用.net4.0.沒辦法啊,自己拿源碼修改兼容唄. 仔細分析源碼發現: 1.ne

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

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

仔細分析源碼發現:

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

2.net4.5 對task api 做了擴展, 我們只需要在.net4.0實現一下對應的api.就可以了.

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

4. 對Task靜態方法的擴展,需要修改一下,靜態方法的調用方式.

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

本段源碼是對: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#內添加以上代碼里, 遇到 Task.Run 的時候,替換成 TaskEx.Run,遇到 Task.Delay 替換為TaskEx.Delay.

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

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

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

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

CefSharp v62修改方法(支持.net4.0):吐槽一下,博客園久了沒有上,賬號沒了,重新申請一個. cesharp v62版本,內核采用最新的Cef 62,支持最新的Grid布局. 由于官方的cefsharp 采用.net4.5.2開發.怎么辦怎么辦.我只能用.net4.0.沒辦法啊,自己拿源碼修改兼容唄. 仔細分析源碼發現: 1.ne
推薦度:
標簽: 修改 ce cefsharp
  • 熱門焦點

最新推薦

猜你喜歡

熱門推薦

專題
Top
主站蜘蛛池模板: 久久这里只有精品9 | 国产国拍亚洲精品永久不卡 | 亚州第一视频 | 亚洲欧美在线免费观看 | 成人精品视频在线观看 | 五十路完熟交尾 | 成人国产精品视频 | 成人一级免费视频 | 亚洲高清视频在线观看 | 欧美.com| 久久精品一区二区国产 | 国产欧美综合一区二区 | 免费a黄色| 欧美一区二区三区视频在线 | 日韩精品 欧美 | 亚洲婷婷在线视频 | 一区二区三区视频在线观看 | 亚洲欧美日韩另类在线专区 | 日韩精品一区二区三区不卡 | 国产视频久久久 | 91香蕉国产亚洲一二三区 | 国产日韩一区二区三区在线播放 | 亚洲欧美日韩精品久久久 | 日韩专区亚洲综合久久 | 伊人色综合97 | 亚欧日韩 | 国产精品99久久久久久www | 中日韩美中文字幕 | 精品一区二区在线观看 | 日韩网址 | 国产欧美精品综合一区 | 国产一区二区三区在线观看视频 | 久久91精品国产91 | 91精品国产综合久久久久久 | 亚洲精品乱码久久久久久 | 国产一级在线 | 好看的电影网站亚洲一区 | 另类专区亚洲 | 人与动性xxxxx免费 | 日本欧美一区二区三区不卡视频 | 狠狠操夜夜 |