CefSharp v62修改,支持.net4.0

来源:http://www.cnblogs.com/had37210/archive/2017/12/18/8057042.html
-Advertisement-
Play Games

吐槽一下,博客園久了沒有上,賬號沒了,重新申請一個. cesharp v62版本,內核採用最新的Cef 62,支持最新的Grid佈局. 由於官方的cefsharp 採用.net4.5.2開發.怎麼辦怎麼辦.我只能用.net4.0.沒辦法啊,自己拿源碼修改相容唄. 仔細分析源碼發現: 1.net4.5 ...


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

    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的支持:

  1 namespace System.Threading.Tasks
  2 {
  3     public static class TaskEx
  4     {
  5         public static TaskAwaiter GetAwaiter(this Task task)
  6         {
  7             return new TaskAwaiter(task);
  8         }
  9 
 10         public static TaskAwaiter<T> GetAwaiter<T>(this Task<T> task)
 11         {
 12             return new TaskAwaiter<T>(task);
 13         }
 14     }
 15 
 16     public struct TaskAwaiter : INotifyCompletion
 17     {
 18         readonly Task task;
 19 
 20         internal TaskAwaiter(Task task)
 21         {
 22             this.task = task;
 23         }
 24 
 25         internal static TaskScheduler TaskScheduler
 26         {
 27             get
 28             {
 29                 if (SynchronizationContext.Current == null)
 30                     return TaskScheduler.Default;
 31                 else
 32                     return TaskScheduler.FromCurrentSynchronizationContext();
 33             }
 34         }
 35 
 36         public bool IsCompleted
 37         {
 38             get { return task.IsCompleted; }
 39         }
 40 
 41         public void OnCompleted(Action continuation)
 42         {
 43             this.task.ContinueWith(
 44                 delegate (Task task) {
 45                     continuation();
 46                 }, TaskAwaiter.TaskScheduler);
 47         }
 48 
 49         public void GetResult()
 50         {
 51             try
 52             {
 53                 task.Wait();
 54             }
 55             catch (AggregateException ex)
 56             {
 57                 throw ex.InnerExceptions[0];
 58             }
 59         }
 60     }
 61 
 62     public struct TaskAwaiter<T> : INotifyCompletion
 63     {
 64         readonly Task<T> task;
 65 
 66         internal TaskAwaiter(Task<T> task)
 67         {
 68             this.task = task;
 69         }
 70 
 71         public bool IsCompleted
 72         {
 73             get { return task.IsCompleted; }
 74         }
 75 
 76         public void OnCompleted(Action continuation)
 77         {
 78             this.task.ContinueWith(
 79                 delegate (Task<T> task) {
 80                     continuation();
 81                 }, TaskAwaiter.TaskScheduler);
 82         }
 83 
 84         public T GetResult()
 85         {
 86             try
 87             {
 88                 return task.Result;
 89             }
 90             catch (AggregateException ex)
 91             {
 92                 throw ex.InnerExceptions[0];
 93             }
 94         }
 95     }
 96 }
 97 
 98 namespace System.Runtime.CompilerServices
 99 {
100     public interface INotifyCompletion
101     {
102         void OnCompleted(Action continuation);
103     }
104 
105     public interface ICriticalNotifyCompletion : INotifyCompletion
106     {
107         [SecurityCritical]
108         void UnsafeOnCompleted(Action continuation);
109     }
110 
111     public interface IAsyncStateMachine
112     {
113         void MoveNext();
114         void SetStateMachine(IAsyncStateMachine stateMachine);
115     }
116 
117     public struct AsyncVoidMethodBuilder
118     {
119         public static AsyncVoidMethodBuilder Create()
120         {
121             return new AsyncVoidMethodBuilder();
122         }
123 
124         public void SetException(Exception exception)
125         {
126             throw exception;
127         }
128 
129         public void SetResult()
130         {
131         }
132 
133         public void SetStateMachine(IAsyncStateMachine stateMachine)
134         {
135             // Should not get called as we don't implement the optimization that this method is used for.
136             throw new NotImplementedException();
137         }
138 
139         public void Start<TStateMachine>(ref TStateMachine stateMachine) where TStateMachine : IAsyncStateMachine
140         {
141             stateMachine.MoveNext();
142         }
143 
144         public void AwaitOnCompleted<TAwaiter, TStateMachine>(ref TAwaiter awaiter, ref TStateMachine stateMachine) where TAwaiter : INotifyCompletion where TStateMachine : IAsyncStateMachine
145         {
146             awaiter.OnCompleted(stateMachine.MoveNext);
147         }
148 
149         public void AwaitUnsafeOnCompleted<TAwaiter, TStateMachine>(ref TAwaiter awaiter, ref TStateMachine stateMachine) where TAwaiter : ICriticalNotifyCompletion where TStateMachine : IAsyncStateMachine
150         {
151             awaiter.OnCompleted(stateMachine.MoveNext);
152         }
153     }
154 
155     public struct AsyncTaskMethodBuilder
156     {
157         TaskCompletionSource<object> tcs;
158 
159         public Task Task { get { return tcs.Task; } }
160 
161         public static AsyncTaskMethodBuilder Create()
162         {
163             AsyncTaskMethodBuilder b;
164             b.tcs = new TaskCompletionSource<object>();
165             return b;
166         }
167 
168         public void Start<TStateMachine>(ref TStateMachine stateMachine) where TStateMachine : IAsyncStateMachine
169         {
170             stateMachine.MoveNext();
171         }
172 
173         public void SetStateMachine(IAsyncStateMachine stateMachine)
174         {
175             // Should not get called as we don't implement the optimization that this method is used for.
176             throw new NotImplementedException();
177         }
178 
179         public void AwaitOnCompleted<TAwaiter, TStateMachine>(ref TAwaiter awaiter, ref TStateMachine stateMachine) where TAwaiter : INotifyCompletion where TStateMachine : IAsyncStateMachine
180         {
181             awaiter.OnCompleted(stateMachine.MoveNext);
182         }
183 
184         public void AwaitUnsafeOnCompleted<TAwaiter, TStateMachine>(ref TAwaiter awaiter, ref TStateMachine stateMachine) where TAwaiter : ICriticalNotifyCompletion where TStateMachine : IAsyncStateMachine
185         {
186             awaiter.OnCompleted(stateMachine.MoveNext);
187         }
188 
189         public void SetResult()
190         {
191             tcs.SetResult(null);
192         }
193 
194         public void SetException(Exception exception)
195         {
196             tcs.SetException(exception);
197         }
198     }
199 
200     public struct AsyncTaskMethodBuilder<T>
201     {
202         TaskCompletionSource<T> tcs;
203 
204         public Task<T> Task { get { return tcs.Task; } }
205 
206         public static AsyncTaskMethodBuilder<T> Create()
207         {
208             AsyncTaskMethodBuilder<T> b;
209             b.tcs = new TaskCompletionSource<T>();
210             return b;
211         }
212 
213         public void Start<TStateMachine>(ref TStateMachine stateMachine) where TStateMachine : IAsyncStateMachine
214         {
215             stateMachine.MoveNext();
216         }
217 
218         public void SetStateMachine(IAsyncStateMachine stateMachine)
219         {
220             // Should not get called as we don't implement the optimization that this method is used for.
221             throw new NotImplementedException();
222         }
223 
224         public void AwaitOnCompleted<TAwaiter, TStateMachine>(ref TAwaiter awaiter, ref TStateMachine stateMachine) where TAwaiter : INotifyCompletion where TStateMachine : IAsyncStateMachine
225         {
226             awaiter.OnCompleted(stateMachine.MoveNext);
227         }
228 
229         public void AwaitUnsafeOnCompleted<TAwaiter, TStateMachine>(ref TAwaiter awaiter, ref TStateMachine stateMachine) where TAwaiter : ICriticalNotifyCompletion where TStateMachine : IAsyncStateMachine
230         {
231             AwaitOnCompleted(ref awaiter, ref stateMachine);
232         }
233 
234         public void SetResult(T result)
235         {
236             tcs.SetResult(result);
237         }
238 
239         public void SetException(Exception exception)
240         {
241             tcs.SetException(exception);
242         }
243     }
244 }
hda37210

這段是對 Task 的擴展

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading;
 6 using System.Threading.Tasks;
 7 
 8 namespace CefSharp
 9 {
10    public class TaskEx
11     {
12         public static Task<T> FromResult<T>(T t)
13         {
14             return Task.Factory.StartNew<T>(() => t);
15         }
16         public static Task Run(Action action)
17         {
18             var tcs = new TaskCompletionSource<object>();
19             new Thread(() => {
20                     try
21                     {
22                         action();
23                         tcs.SetResult(null);
24                     }
25                     catch (Exception ex)
26                     {
27                         tcs.SetException(ex);
28                     }
29                 })
30                 { IsBackground = true }.Start();
31             return tcs.Task;
32         }
33         public static Task<TResult> Run<TResult>(Func<TResult> function)
34         {
35             var tcs = new TaskCompletionSource<TResult>();
36             new Thread(() =>
37                 {
38                     try
39                     {
40                         tcs.SetResult(function());
41                     }
42                     catch (Exception ex)
43                     {
44                         tcs.SetException(ex);
45                     }
46                 })
47                 { IsBackground = true }.Start();
48             return tcs.Task;
49         }
50         public static Task Delay(int milliseconds)
51         {
52             var tcs = new TaskCompletionSource<object>();
53             var timer = new System.Timers.Timer(milliseconds) { AutoReset = false };
54             timer.Elapsed += delegate { timer.Dispose(); tcs.SetResult(null); };
55             timer.Start();
56             return tcs.Task;
57         }
58     }
59 }
hda37210

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

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

祝您順利!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一.什麼是值類型?什麼引用類型? 1.值類型的值是存儲在棧上的。引用類型是存在堆上的。 2.值類型變數聲明之後,不管是否已經分配記憶體,編譯器在堆上為其分配記憶體。 3.引用類型聲明的時候,這時候只在棧中分配一小片記憶體用於容納一個地址,此時候並沒有為其分配堆上的記憶體地址,當new一個實例的時候,真正創建 ...
  • PS:寫這個主要是基礎差,寫這麼一個主要是為了自己查漏補缺,不會的搞會了。會了搞的更會。順便整理知識。 目錄 1.C#知識點之:值類型和引用類型 ...
  • 先來看看下麵一個類中的一些方法: class Bc { public double Add(double number1, double number2) { return number1 + number2; } public double Multiply(double number1, dou ...
  • 最近做的項目,上線後一切正常,過段時間管理員反饋用戶導出EXCEL報錯,前臺獲取用戶列表不顯示,查找問題找到是微信昵稱、emoji表情導致報錯, emoji表情介紹 由於微信介面中對於emoji表情使用的是UTF-8的二進位字元串,並沒有解碼,表現就是當收到微信端用戶發來的emoji表情時,顯示為一 ...
  • 類只能繼承一個類,不能繼承多個類,但可以繼承多個介面Interface。 類是對象的抽象,抽象類是類的抽象,而介面是行為的抽象。 下麵Insus.NET創建2個介面: 介面是統一行為,抽象是從現在有代碼中,把上同代碼抽取出來的一個抽象方法,而介面卻是相反。不清楚有什麼子類存在,行為具體實現也不確定。 ...
  • 通過前面的文章,已經學習了怎麼使用線程,怎麼使用線程同步,怎麼使用線程池,怎麼使用任務並行庫。儘管通過上面的學習,對於線程的使用越來越簡單。有沒有更簡單的方法呢。 C# 5.0之後,微軟在c#語言中添加了兩個關鍵字async與await,這是在TPL上面的更高一級的抽象,真正簡化了異... ...
  • 抽象類,有3個特點: 第1個,不能被實例化。 第2個,類中的抽象方法在繼承的子類中必須重寫。 第3個,類一旦有抽象方法出現,那這個類必須定義為抽象類。 現實開發中,發現有共同的代碼,可以把這些共同的代碼放在一個抽象類中。舉個例子,計算四邊形的周長。 矩形,長方形,正方形: class Rectang ...
  • 隨著軟體的不斷發展,出現了更多的身份驗證使用場景,除了典型的伺服器與客戶端之間的身份驗證外還有,如服務與服務之間的(如微服務架構)、伺服器與多種客戶端的(如PC、移動、Web等),甚至還有需要以服務的形式開放給第三方的,身份驗證這一功能已經演化為一個服務,很多大型應用中都有自己的身份驗證伺服器甚至集 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...