<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答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
        主站蜘蛛池模板: 亚洲精品成人网站在线观看| 久久精品国产亚洲精品| 亚洲黄色高清视频| 99re6在线精品视频免费播放 | 免费激情视频网站| 亚洲乱妇熟女爽到高潮的片| 大香人蕉免费视频75| 亚洲av无码专区亚洲av不卡| 免费永久国产在线视频| 一区二区三区视频免费| 久久久久亚洲精品无码网址 | 中文字幕免费播放| 国产日韩亚洲大尺度高清| 免费久久人人爽人人爽av| 午夜亚洲www湿好大| 亚洲一区二区免费视频| 亚洲欧洲日韩极速播放| 日本一道综合久久aⅴ免费| 边摸边吃奶边做爽免费视频网站| 国产91精品一区二区麻豆亚洲| 中文字幕免费在线观看动作大片 | 精品亚洲一区二区| 最近中文字幕大全中文字幕免费| 亚洲性无码一区二区三区| 国产精品视频免费一区二区三区 | 暖暖日本免费中文字幕| 精品日韩亚洲AV无码一区二区三区 | 2021精品国产品免费观看| 亚洲人和日本人jizz| 日韩中文无码有码免费视频 | 亚洲熟女一区二区三区| 久久99精品免费视频| 在线aⅴ亚洲中文字幕| 久久亚洲高清综合| 91免费人成网站在线观看18| 成人精品国产亚洲欧洲| 久久亚洲精品成人综合| 日本一道一区二区免费看| 色www永久免费| 亚洲欧美国产国产一区二区三区 | 在线亚洲午夜片AV大片|