主頁 > .NET開發 > CefSharp中文幫助檔案

CefSharp中文幫助檔案

2022-04-26 06:01:04 .NET開發

目錄


1、基礎知識

1.1 cefsharp設定默認語言
1.2 cefSharp 服務器運行要求
1.3 cefsharp設定網頁接受語言AcceptLanguage
1.4 cef設定userAgent

2、配置管理

2.1、CommandLine配置

3、請求流程處理

3.1 讀取網頁源代碼
3.2 獲取頁面中的指定檔案內容(.jpg,.js等)
3.3 過濾某些頁面內容,例如圖片或某些文字
3.4 檔案進一步獲取,獲取完整內容
3.5 檔案進一步獲取,獲取完整內容(優化,Content-Length不一致)

4、 Cookie處理

4.1 設定cookie
4.2 讀取cookie

5、 Js處理

5.1 基本的同步js操作
5.2 其他Frame操作

6、 資源清理

6.1 瀏覽器本身處理
6.2 需要關閉瀏覽器負載程式時操作

7、 擴展功能

8、 常見錯誤

8.1 下載CefSharp master zip code檔案編譯報錯
8.2 無法創建新的堆疊防護頁面
8.3 結束瀏覽器后,CefSharp.BrowserSubprocess.exe進行無法結束

9、 GitHub---Wiki(部分內容使用了Google進行翻譯)

9.1 如何使用.NET 呼叫 JavaScript方法?
9.2 如何獲取 Javascript 方法回傳的結果?
9.3 如何暴露.NET類,提供給Javascript?
9.4 為什么我得到一個錯誤有關“無法加載檔案或程式集 CefSharp.Core.dll ”或它的一個依賴,指定的模塊找不到,“當試圖運行基于我CefSharp的應用程式?它編譯成功,但不運行?它運行我的開發機器上,雖然拋出一個例外,當我把它復制到另一臺計算機?
9.5 為什么當我將 ChromiumWebBrowser 添加到我的應用程式時,Visual Studio WPF設計器不起作用?
9.6 如何在目標應用程式中包含Visual Studio C ++ 2012/2013可再發行組件?
9.7 如何重寫 Javascript 的 window.alert 事件和相似的?
9.8 CefSharp3二進制程式在哪里?
9.9 Windows XP/2003支持?
9.10 當我重新發布使用CefSharp的應用程式時,需要包括什么檔案?
9.11 構建程序不能復制CEF檔案
9.12 為什么 IndexedDB 回傳 QuotaExceededError?
9.13 在C#中如何處理Javascript事件?
9.14 如何實作 WinForms 拖放?

10、 參考網址

11、 其他


1、基礎知識

1.1 cefsharp設定默認語言

cefsharp是不錯的瀏覽器內核封裝版本之一,默認語言是en-US,這個一直困擾著專案,專案好多處需修改,后來經多次嘗試,才發現,原來設定默認語言這么簡單,
Loacal 屬性就是對CefSharp運行語言環境進行設定
var setting = new CefSharp.CefSettings();

// 設定語言
setting.Locale = "zh-CN";
CefSharp.Cef.Initialize(setting, true, false);
以上這段代碼一定要在new ChromiumWebBrowser之前呼叫

1.2 cefSharp 服務器運行要求

.net framework 環境和 vc++ 2013 runtime (x86/x64)

1.3 cefsharp設定網頁接受語言AcceptLanguage

什么是 cefsharp設定網頁接受語言AcceptLanguage
1.設定瀏覽器的請求控制器
 webView.RequestHandler = new RequestHandler(); 
2.新建RequestHandler類繼承IRequestHandler介面,實作方法OnBeforeResourceLoad,新版本如果又變更但是整體思路不變,內部處理是一致的請見諒,

public bool OnBeforeResourceLoad(IWebBrowser browser, IRequestResponse requestResponse)
{
    IDictionary<string, string> headers = requestResponse.Request.GetHeaders();  
    headers.Add("Accept-Language", "zh,zh-cn,zh-tw");  
    requestResponse.Request.SetHeaders(headers);  
    return false;  
}  

1.4 cef設定userAgent

var setting = new CefSharp.CefSettings();  
setting.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36";  
CefSharp.Cef.Initialize(setting, true, false);  

2、配置管理

2.1、CommandLine配置

所有配置:http://peter.sh/experiments/chromium-command-line-switches/
樣例參考:

var settings = new CefSettings();  
settings.CefCommandLineArgs.Add("no-proxy-server", "1");  
settings.CefCommandLineArgs.Add("proxy-server", "ProxyAddress");  
Cef.Initialize(settings, true, true); 

3、請求流程處理

3.1 讀取網頁源代碼

在頁面加載完成后處理, 依賴最低環境 4.5.2

async void browser_FrameLoadEnd(object sender, FrameLoadEndEventArgs e)  
{  
    Log.WriteLog("browser_FrameLoadEnd:" + e.Url);  

    var result = await browser.GetSourceAsync();  
}  

如果想在4.0下環境操作需要使用,

 var task = browser.GetSourceAsync();  
 task.Wait();  
 string content = task.Result;  

3.2 獲取頁面中的指定檔案內容(.jpg,.js等)

A.首先需要對ChromiumWebBrowser 的 IRequestHandler RequestHandler進行實作,
B.需要對 IRequestHandler 的IResponseFilter IRequestHandler.GetResourceResponseFilter 方法進行重寫,
C.需要寫一個類實作 IResponseFilter 介面,
D.然后就可用在IResponseFilter 的
FilterStatus Filter(Stream dataIn, out long dataInRead, Stream dataOut, out long dataOutWritten) 方法中,讀取指定內容的流了,

3.3 過濾某些頁面內容,例如圖片或某些文字

具體實作,參考 3.2 ,在最后的Filter方法中,對回傳的dataOut不進行賦值或者,取到值,然后replace處理,回傳其他資料,即可,

3.4 檔案進一步獲取,獲取完整內容

說明:由于很多檔案無法獲取到完整內容,再者具體檔案內容在Filter里面進行了控制,而Fileter的內容依賴于IRequestHandler所以,外部只能操作Handler得到資料,
所以需要在,Filter和Hanlder類中,使用事件來傳遞具體的內容,代碼如下,
Filter類如下:

public class TestImageFilter : IResponseFilter  
    {  
        public event Action<byte[]> NotifyData;  
        private int contentLength = 0;  
        private List<byte> dataAll = new List<byte>();  

        public void SetContentLength(int contentLength)  
        {  
            this.contentLength = contentLength;  
        }  

        public FilterStatus Filter(System.IO.Stream dataIn, out long dataInRead, System.IO.Stream dataOut, out long dataOutWritten)  
        {  
            try  
            {  
                if (dataIn == null)  
                {  
                    dataInRead = 0;  
                    dataOutWritten = 0;  

                    return FilterStatus.Done;  
                }  

                dataInRead = dataIn.Length;  
                dataOutWritten = Math.Min(dataInRead, dataOut.Length);  

                dataIn.CopyTo(dataOut);  
                dataIn.Seek(0, SeekOrigin.Begin);  
                byte[] bs = new byte[dataIn.Length];  
                dataIn.Read(bs, 0, bs.Length);  
                dataAll.AddRange(bs);  

                if (dataAll.Count == this.contentLength)  
                {  
                    // 通過這里進行通知  
                    NotifyData(dataAll.ToArray());  

                    return FilterStatus.Done;  
                }  
                else if (dataAll.Count < this.contentLength)  
                {  
                    dataInRead = dataIn.Length;  
                    dataOutWritten = dataIn.Length;  

                    return FilterStatus.NeedMoreData;  
                }  
                else  
                {  
                    return FilterStatus.Error;  
                }  
            }  
            catch (Exception ex)  
            {  
                dataInRead = dataIn.Length;  
                dataOutWritten = dataIn.Length;  

                return FilterStatus.Done;  
            }  
        }  

        public bool InitFilter()  
        {  
            return true;  
        }  
    }  

Filter類有了,那我們如何知道資料流的具體長度呢?這就需要在Handler的實作的其他方法里面尋找了,


        bool IRequestHandler.OnResourceResponse(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response)  
        {  
            //NOTE: You cannot modify the response, only the request  
            // You can now access the headers  
            //var headers = response.ResponseHeaders;  
            try  
            {  
                var content_length = int.Parse(response.ResponseHeaders["Content-Length"]);  
                if (this.filter != null)  
                {  
                    this.filter.SetContentLength(content_length);  
                }  
            }  
            catch { }  
            return false;  
        }  

        private TestImageFilter filter = null;  
        public event Action<byte[]> NotifyData;  

        IResponseFilter IRequestHandler.GetResourceResponseFilter(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response)  
        {  
            var url = new Uri(request.Url);  
            if (url.AbsoluteUri.Contains("http://test.test.com/somehead?"))  
            {  
                this.filter = new TestImageFilter();  
                filter.NotifyData += filter_NotifyData;  

                return filter;  
            }  

            return null;  
        }  

        void filter_NotifyData(byte[] data)  
        {  
            if (NotifyData != null)  
            {  
                NotifyData(data);  
            }  
        }  

此方法為IRequestHandler的一部分實作,通過實作函式:IRequestHandler.GetResourceResponseFilter得到資源檔案的長度,然后長度傳入Filter,在Filter中控制從而得到整個資料的真正長度,

3.5 檔案進一步獲取,獲取完整內容(優化,Content-Length不一致)

由于,部分站點,回傳資料是分片了的,即:不能通過,Content-Length的長度來判斷,程式的流是否完成,
所以需要其他方式處理,即:單個http請求完成的時候,會呼叫Complete方法,所以可以在這里處理,
下面是測驗代碼:
Filter管理類

public class FilterManager
    {
        private static Dictionary<string, IResponseFilter> dataList = new Dictionary<string, IResponseFilter>();

        public static IResponseFilter CreateFilter(string guid)
        {
            lock (dataList)
            {
                var filter = new TestImageFilter();
                dataList.Add(guid, filter);

                return filter;
            }
        }

        public static IResponseFilter GetFileter(string guid)
        {
            lock (dataList)
            {
                return dataList[guid];
            }
        }
    }

TestFilter類,對流進行合并

public class TestImageFilter : IResponseFilter
    {
        public List<byte> dataAll = new List<byte>();

        public FilterStatus Filter(System.IO.Stream dataIn, out long dataInRead, System.IO.Stream dataOut, out long dataOutWritten)
        {
            try
            {
                if (dataIn == null || dataIn.Length == 0)
                {
                    dataInRead = 0;
                    dataOutWritten = 0;

                    return FilterStatus.Done;
                }

                dataInRead = dataIn.Length;
                dataOutWritten = Math.Min(dataInRead, dataOut.Length);

                dataIn.CopyTo(dataOut);
                dataIn.Seek(0, SeekOrigin.Begin);
                byte[] bs = new byte[dataIn.Length];
                dataIn.Read(bs, 0, bs.Length);
                dataAll.AddRange(bs);

                dataInRead = dataIn.Length;
                dataOutWritten = dataIn.Length;

                return FilterStatus.NeedMoreData;
            }
            catch (Exception ex)
            {
                dataInRead = dataIn.Length;
                dataOutWritten = dataIn.Length;

                return FilterStatus.Done;
            }
        }

        public bool InitFilter()
        {
            return true;
        }
    }

最后是部分的,IRequestHandler實作代碼

public class RequestHandler : IRequestHandler
    {
        // 略去代碼 ...

        public event Action<byte[]> NotifyMsg;

        IResponseFilter IRequestHandler.GetResourceResponseFilter(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response)
        {
            var url = new Uri(request.Url);
            if (url.AbsoluteUri.Contains("https://res.wx.qq.com/zh_CN/htmledition/v2/css/base/base2e4e03.css"))
            {
                var filter = FilterManager.CreateFilter(request.Identifier.ToString());

                return filter;
            }

            return null;
        }

        void filter_NotifyData(byte[] data)
        {
            if (NotifyMsg != null)
            {
                NotifyMsg(data);
            }
        }

        void IRequestHandler.OnResourceLoadComplete(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response, UrlRequestStatus status, long receivedContentLength)
        {
            if (request.Url.Contains("https://res.wx.qq.com/zh_CN/htmledition/v2/css/base/base2e4e03.css"))
            {
                var filter = FilterManager.GetFileter(request.Identifier.ToString()) as TestImageFilter;

                filter_NotifyData(filter.dataAll.ToArray());
            }
        }
    }

4、Cookie處理

4.1 設定cookie

var cookieManager = CefSharp.Cef.GetGlobalCookieManager();  
await cookieManager.SetCookieAsync("http://" + domain, new CefSharp.Cookie()  
{  
    Domain = domain,  
    Name = name,  
    Value = https://www.cnblogs.com/88223100/archive/2022/04/25/value,  
    Expires = DateTime.MinValue  
}); 

4.2 讀取cookie

建立Cookie讀取物件,繼承介面 ICookieVisitor

    public class CookieVisitor : CefSharp.ICookieVisitor  
    {  
        public event Action<CefSharp.Cookie> SendCookie;  
        public bool Visit(CefSharp.Cookie cookie, int count, int total, ref bool deleteCookie)  
        {  
            deleteCookie = false;  
            if (SendCookie != null)  
            {  
                SendCookie(cookie);  
            }  
  
            return true;  
        }  
    }  

在browser事件中進行處理

private void browser_FrameLoadEnd(object sender, CefSharp.FrameLoadEndEventArgs e)  
{  
    var cookieManager = CefSharp.Cef.GetGlobalCookieManager();  
  
    CookieVisitor visitor = new CookieVisitor();  
    visitor.SendCookie += visitor_SendCookie;  
    cookieManager.VisitAllCookies(visitor);  
}  

/// 回呼事件

private void visitor_SendCookie(CefSharp.Cookie obj)  
{  
    cookies += obj.Domain.TrimStart('.') + "^" + obj.Name + "^" + obj.Value + "$";  
}  

5、Js處理

5.1 基本的同(異)步js操作

browser.GetBrowser().MainFrame.ExecuteJavaScriptAsync("document.getElementById('testid').click();");  
browser.GetBrowser().MainFrame.ExecuteJavaScriptAsync("document.getElementById('testid2').value='https://www.cnblogs.com/88223100/archive/2022/04/25/123'");  

5.2 其他Frame操作

string script = "if(document.getElementById('img_out_10000')){ document.getElementById('img_out_10000').click(); }";  
var list = browser.GetBrowser().GetFrameNames();  
if (list.Count > 1)  
{  
    browser.GetBrowser().GetFrame(list[1]).ExecuteJavaScriptAsync(script);  
}  

5.3 js回呼,C#方法

參見本檔案:9.3

6、資源清理

6.1 瀏覽器本身處理

static ChromiumWebBrowser()  
{  
    if (CefSharpSettings.ShutdownOnExit)  
    {  
        Application.ApplicationExit += OnApplicationExit;  
    }  
}  
  
private static void OnApplicationExit(object sender, EventArgs e)  
{  
    Cef.Shutdown();  
}  

6.2 需要關閉瀏覽器負載程式時操作

try  
{  
    browser.CloseDevTools();  
    browser.GetBrowser().CloseBrowser(true);  
}  
catch { }   
  
try  
{  
    if (browser != null)  
    {  
        browser.Dispose();  
        Cef.Shutdown();  
    }  
}  
catch { }  

7、擴展功能

8、常見錯誤

8.1 下載CefSharp master zip code檔案編譯報錯

下載地址:https://codeload.github.com/cefsharp/CefSharp/zip/master
錯誤提示:

由于編譯路徑存在中文導致,

8.2 無法創建新的堆疊防護頁面

可能是由于 行程“ CefSharp.BrowserSubprocess.exe ”沒有正常結束掉,一直占用記憶體增加,直到...

8.3 結束瀏覽器后,CefSharp.BrowserSubprocess.exe進行無法結束

需要確保,創建瀏覽器的執行緒和呼叫Cef.ShutDown();的執行緒確保在同一個執行緒中進行操作,
如果是主執行緒創建,關閉程式后BrowserSubprocess行程可以直接退出,
如果是非主執行緒,需要在創建瀏覽器,即:把瀏覽器系結到控制元件的執行緒,呼叫shutdown方法,

9、GitHub---Wiki(部分內容使用了Google進行翻譯)

本檔案的大部分將被替換為新的 一般使用指南 - 必須閱讀!

快速FAQ TOC 英文版本

本FAQ?10項,嘗試列出一些很酷的CefSharp特性和一些最常見的問題的的,

有關更多提示,請查看不斷增加的問題串列faq-able!

  1. 如何使用.NET 呼叫 JavaScript方法?
  2. 如何獲取 Javascript 方法回傳的結果呢?
  3. 如何暴露.NET類,提供給Javascript?
  4. “無法加載檔案或程式集 CefSharp.Core.dll ”或它的一個依賴,
  5. 為什么當我將 ChromiumWebBrowser 添加到我的應用程式時,Visual Studio WPF設計器不起作用?
  6. 如何在目標應用程式中包含Visual Studio C ++ 2012/2013可再發行組件?
  7. 如何重寫 Javascript 的 window.alert 事件和相似的?
  8. CefSharp3二進制程式在哪里?
  9. Windows XP/2003支持?
  10. 當我重新發布使用CefSharp的應用程式時,需要包括什么檔案?
  11. 構建程序不能復制CEF檔案
  12. 為什么 IndexedDB 回傳 QuotaExceededError?
  13. 在C#中如何處理Javascript事件?
  14. 如何實作 WinForms 拖放?

1. 如何使用.NET 呼叫 JavaScript方法?

簡單代碼可能看起來像這樣:

var script = string.Format("document.body.style.background = '{0}'", colors[color_index++]);if (color_index >= colors.Length)  
{  
    color_index = 0;  
}  
  
browser.GetMainFrame().ExecuteJavaScriptAsync(script);  
什么時候可以開始執行 Javascript

不幸的是加載DOM之前OnFrameLoadStart被呼叫,所以你需要使用如下之一:FrameLoadEnd / LoadingStateChanged / IRenderProcessMessageHandler.OnContextCreated,下面是幾個例子

不幸的是,在加載DOM之前呼叫 OnFrameLoadStart ,所以你需要使用下面的一個方法: FrameLoadEnd/LoadingStateChanged/IRenderProcessMessageHandler.OnContextCreated ,這里有幾個例子

browser.RenderProcessMessageHandler = new RenderProcessMessageHandler();

public class RenderProcessMessageHandler : IRenderProcessMessageHandler
{
  // Wait for the underlying `Javascript Context` to be created, this is only called for the main frame.
  // If the page has no javascript, no context will be created.
  void IRenderProcessMessageHandler.OnContextCreated(IWebBrowser browserControl, IBrowser browser, IFrame frame)
  {
    const string script = "document.addEventListener('DOMContentLoaded', function(){ alert('DomLoaded'); });";

    frame.ExecuteJavaScriptAsync(script);
  }
}

//Wait for the page to finish loading (all resources will have been loaded, rendering is likely still happening)
browser.LoadingStateChanged += (sender, args) =>
{
  //Wait for the Page to finish loading
  if (args.IsLoading == false)
  {
    browser.ExecuteJavaScriptAsync("alert('All Resources Have Loaded');");
  }
}

//Wait for the MainFrame to finish loading
browser.FrameLoadEnd += (sender, args) =>
{
  //Wait for the MainFrame to finish loading
  if(args.Frame.IsMain)
  {
    args.Frame.ExecuteJavaScriptAsync("alert('MainFrame finished loading');");
  }
};

注意:腳本是在 Frame 級別執行,永遠頁面至少有一個Frame( MainFrame ), IWebBrowser.ExecuteScriptAsync 擴展方法是為了向后兼容,可以將其用作在主框架上執行 js 的快捷方式,

2. 如何獲取 Javascript 方法回傳的結果?

如果需要評估回傳值的代碼,使用 Task<JavascriptResponse> EvaluateScriptAsync(string script, TimeSpan? timeout) 方法, JavaScript代碼是異步執行的,因此使用.NET Task 類回傳一個回應,其中包含錯誤訊息,結果和一個成功(bool)標志,

// Get Document Height  
var task = frame.EvaluateScriptAsync("(function() { var body = document.body, html = document.documentElement; return  Math.max( body.scrollHeight, body.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight ); })();", null);
  
task.ContinueWith(t =>  
{  
    if (!t.IsFaulted)  
    {  
        var response = t.Result;  
        EvaluateJavaScriptResult = response.Success ? (response.Result ?? "null") : response.Message;  
    }  
}, TaskScheduler.FromCurrentSynchronizationContext());  

有關更詳細的例子 Gist

Notes

  • 腳本是在 Frame 級別執行,永遠頁面至少有一個Frame( MainFrame
  • 只能回傳一般的值(如int,bool,string等) - 不是您自己定義的復雜(用戶定義)型別,這是因為沒有(容易的)方式將隨機的JavaScript物件暴露給.NET World,至少不是今天,但是,一種可能的技術是,將要回傳到.NET代碼的Javascript物件轉換為JSON物件,使用 JSON.toStringify() 方法轉化為JSON字串,并將該字串回傳到您的.NET代碼,然后,您可以將該字串解碼為一個類似JSON.net的.NET物件,有關更多資訊,請參閱此MSDN鏈接, (https://msdn.microsoft.com/library/cc836459(v=vs.94).aspx)

3. 如何暴露.NET類,提供給Javascript?

參考 般使用指南 - 如何公開.Net類

4. 為什么我得到一個錯誤有關“無法加載檔案或程式集 CefSharp.Core.dll ”或它的一個依賴,指定的模塊找不到,“當試圖運行基于我CefSharp的應用程式?它編譯成功,但不運行?它運行我的開發機器上,雖然拋出一個例外,當我把它復制到另一臺計算機?

這是一個常見的錯誤,通常是以下之一

  1. VC++ 2012/2013 可重新分發包*是為了在非開發者機器上運行CefSharp所必需的,有關詳細資訊,請參閱下面的FAQ#6, 您可以將所需的dll作為應用程式的一部分,
  2. 執行檔案夾中不存在所有依賴關系, CefSharp 包括 非托管 的dll和資源,這些檔案通過安裝 Nuget 包時包含在專案中的兩個 .props
    檔案復制到執行檔案夾, 請參閱下面所需的檔案串列,確保所需的檔案存在,
  3. 你通過安裝程式打包應用程式進行發布,并且不會在目標計算機上運行, 默認情況下,安裝程式不包括 非托管 資源,您需要手動添加它們, 對于 ClickOnce ,請參閱#1314其他用戶提出的一些指標和解決方案,

可以在這里找到所需檔案的串列:Output files description (Redistribution)

: 如果在 XAML 中初始化 WPF 控制元件時遇到 FileNotFoundException ,這也適用,

注2:如果從源代碼編譯(不推薦使用 Nuget 包),并注意到您不能再以debug模式構建,但是release構建作業正常,您可能需要修復Visual Studio版本, 這種情況發生在少數情況下,您將獲得如上所示,丟失的非托管.dll檔案相同的提示資訊,

5. 為什么當我將 ChromiumWebBrowser 添加到我的應用程式時,Visual Studio WPF設計器不起作用?

版本 57.0.0 增加了最小的設計器支持,有關詳細資訊,請參見 https://github.com/cefsharp/CefSharp/pull/1989,

舊版本不支持 WPF 設計器,這是不幸的,CefSharp是用C++代碼撰寫的,后者又參考了CEF DLLs 導致的結果,這種情況下,Visual Studio 設計器不能夠很好的支持,在論壇的主題將進一步解釋,并提供可能的解決方法, 我認為(不幸的是)最簡單的解決方法是接受一個事實,即支持并不容易,但是還有其他方法,如果你真的覺得你需要舊版本,

6. 如何在目標應用程式中包含Visual Studio C ++ 2012/2013 再發布?

CefSharp 需要 VC ++運行時 ,你必須安裝/包括這與你的應用程式的幾個選項:

  • 你可以在你希望運行 CefSharp 基于應用程式的每臺計算機上安裝 VC++ ,一旦安裝更新就可以通過 Windows Update 進行管理,
  • 您可以設定在 Visual Studio C++ 再分發作為安裝程式的先決條件(即的ClickOnce或WiX的工具集)
  • 通過復制到您的專案在此檔案夾(只有當你安裝了Visual Studio中的匹配版本存在)的內容:
#對于VC ++ 2012(86)
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\redist\x86\Microsoft.VC110.CRT
#對于VC ++ 2012(64)
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\redist\x64\Microsoft.VC110.CRT
#對于VC ++ 2013(86)
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\redist\x86\Microsoft.VC120.CRT
#對于VC ++ 2013(64)
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\redist\x64\Microsoft.VC120.CRT

隨著第三方法,你將不再需要為前提的 Visual C++ 2012/2013 運行時檔案 安裝到客戶端,就目前的計劃是留在VC2013官方CefSharp二進制版本,可行時,我們可能會切換到VC2015,如果你從源代碼構建自己的你部署的程序中必須與您構建環境,對于官方的 Nuget 版本的詳細資訊請參見發布分支表,

欲了解更多資訊,請參閱重新分發 Visual C++ 檔案,要下載,請訪問Visual Studio C++ 2012/2013 再發行

一個新的選項是 JetBrainsNuget.org 上有一個Microsoft.VC120.CRT.JetBrains ,似乎包含相關檔案,您仍然需要連接一些后期構建任務將其復制到您的bin檔案夾,

注意 當從源代碼構建時,確保在部署到沒有安裝 Visual Studio 的機器時以 Release 模式進行編譯, Visual C++ 使用一套不同的除錯和發布版本的運行時庫, Debug 運行時庫僅安裝有 Visual Studio 中,如果你使用他們已經建在釋放模式官方的 NuGet軟體包 ,您可以隨后建立在除錯模式下您的應用程式,因為只有在 Visual C++ 專案需要在 Release 模式下進行編譯,

7. 如何重寫 Javascript 的 window.alert 事件和相似的事件?

ChromiumWebBrowser 控制元件提供了一個名為 JsDialogHandler 的屬性, 該屬性可以設定為一個類,可以用來覆寫這些對話框的行為,

8. CefSharp3二進制程式在哪里?

CefSharp3被發布為 Nuget 包, 請參閱https://github.com/cefsharp/CefSharp/blob/master/README.md#nuget-packages 以獲取最新的穩定版本和預發行版本,

對于使用NuGet軟體包的一個非常簡單的示例專案,請參閱CefSharp.MinimalExample 存盤庫, 克隆它/下載原始碼,如果你想要一個真正的小而簡單的例子,如何使用CefSharp3,

請注意: 平臺目標

使用這些包時,必須 選擇 x86x64 , 如果您選擇 AnyCPU ,NuGet magic將無法正常作業,_請參閱steps to configure your solution here,

9. Windows XP/2003支持?

我們不再支持 Windows XP/2003 ,官方的 Nuget 軟體包沒有在 Windows XP/2003 上進行測驗, 您可能會喜歡使用目標為 VC++ 2013 的較新版本( VC++ 2012 packages 有一個已知問題),(記住 CefSharp.Example.* 專案是使用 .Net 4.5 編譯的,所以如果你想使用提供的例子,你必須重新定位它們并相應地更新代碼),

請不要創建與 Windows XP 相關的 新的 問題, 以下 https://github.com/cefsharp/CefSharp/wiki/Windows-XP-No-Longer-Supported Wiki 頁面可能很有用,可以由任何具有 GitHub 帳戶的人進行編輯,因此請隨時提供,您認為可能證明有用的任何資訊,

10. 當我重新發布使用CefSharp的應用程式時,需要包括什么檔案?

請參閱: Output files description (Redistribution)

11. 構建程序不能復制CEF檔案

有時,編譯程序不能復制CEF檔案,并且會在最終失敗之前重試多次, 即使應用程式關閉,CefSharp.BrowserSubprocess.exe 仍然運行時也會發生這種情況,
解決方案,使用任務管理器,手動殺死 CefSharp.BrowserSubprocess.exe

12. 為什么 IndexedDB 回傳 QuotaExceededError?

使用IndexedDB時,必須將CefSettings CachePath設定為當前用戶具有寫入權限的目錄, 在大多數情況下,您可以使用這樣的代碼創建快取目錄,并在Initialize() 期間將設定傳遞給Cef:

// On Win7 this will create a directory in AppData.
var cache = System.IO.Path.Combine(Environment.GetFolderPath (Environment.SpecialFolder.ApplicationData), System.IO.Path.Combine("MyApplication","cache"));
if (!System.IO.Directory.Exists (cache))
    System.IO.Directory.CreateDirectory (cache);

// Set the CachePath during initialization.
var settings = new CefSettings(){CachePath = cache};
Cef.Initialize (settings);

13. 在C#中如何處理Javascript事件?

public class BoundObject
{
    public void OnFrameLoadEnd (object sender, FrameLoadEndEventArgs e)
    {
      if(e.Frame.IsMain)
      {
        browser.ExecuteScriptAsync(@"
          document.body.onmouseup = function()
          {
            bound.onSelected(window.getSelection().toString());
          }
        ");
      }
    }

    public void OnSelected(string selected)
    {
        MessageBox.Show("The user selected some text [" + selected + "]");
    }
}

// ...

// After your ChromiumWebBrowser has been instantiated (for WPF directly after `InitializeComponent();` in the control constructor).
var obj = new BoundObject();
browser.RegisterJsObject("bound", obj);
browser.FrameLoadEnd += obj.OnFrameLoadEnd ;

請注意:

  • 在創建 ChromiumWebBrowser 實體之后,應該直接呼叫 RegisterJsObject
  • "bound" 將作為可在網頁上運行的任何JS腳本訪問的頂級物件創建的物件的名稱, 您可以使用任何您喜歡的,但確保它不與現有的JS物件沖突,并且名稱與C#和JS匹配,
  • 此示例使用 FrameLoadEnd 事件即時將JS代碼注入到網頁中, 如果您控制了網頁,可以將JS代碼添加到網頁中,
  • 我們使用單個字串引數呼叫 OnSelected C#方法, 您可以使用任何數量的引數,也可以不使用任何引數,但都必須是原始型別,
  • 確保將復雜的JS物件轉換為字串,或將其轉換為JSON,
  • 由于CefSharp將通過其名稱搜索 OnSelected 方法,請確保您的混淆器不會將該方法重命名為別的東西,否則將不會被執行,

14. 如何實作 WinForms 拖放?

一個可能的解決方案概述 https://github.com/cefsharp/CefSharp/issues/1593#issuecomment-304451518

10、參考網址

http://www.cnblogs.com/TianFang/p/4658151.html

11、其他

                                                   檔案僅供參考,錯誤之處望修改,或指正

本文來自博客園,作者:古道輕風,轉載請注明原文鏈接:https://www.cnblogs.com/88223100/p/CefSharp_Chinese_Help_Documentation.html

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/463989.html

標籤:.NET技术

上一篇:CefSharp中文幫助檔案

下一篇:在復雜的JavaScript物件中回圈出現問題

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • WebAPI簡介

    Web體系結構: 有三個核心:資源(resource),URL(統一資源識別符號)和表示 他們的關系是這樣的:一個資源由一個URL進行標識,HTTP客戶端使用URL定位資源,表示是從資源回傳資料,媒體型別是資源回傳的資料格式。 接下來我們說下HTTP. HTTP協議的系統是一種無狀態的方式,使用請求/ ......

    uj5u.com 2020-09-09 22:07:47 more
  • asp.net core 3.1 入口:Program.cs中的Main函式

    本文分析Program.cs 中Main()函式中代碼的運行順序分析asp.net core程式的啟動,重點不是剖析原始碼,而是理清程式開始時執行的順序。到呼叫了哪些實體,哪些法方。asp.net core 3.1 的程式入口在專案Program.cs檔案里,如下。ususing System; us ......

    uj5u.com 2020-09-09 22:07:49 more
  • asp.net網站作為websocket服務端的應用該如何寫

    最近被websocket的一個問題困擾了很久,有一個需求是在web網站中搭建websocket服務。客戶端通過網頁與服務器建立連接,然后服務器根據ip給客戶端網頁發送資訊。 其實,這個需求并不難,只是剛開始對websocket的內容不太了解。上網搜索了一下,有通過asp.net core 實作的、有 ......

    uj5u.com 2020-09-09 22:08:02 more
  • ASP.NET 開源匯入匯出庫Magicodes.IE Docker中使用

    Magicodes.IE在Docker中使用 更新歷史 2019.02.13 【Nuget】版本更新到2.0.2 【匯入】修復單列匯入的Bug,單元測驗“OneColumnImporter_Test”。問題見(https://github.com/dotnetcore/Magicodes.IE/is ......

    uj5u.com 2020-09-09 22:08:05 more
  • 在webform中使用ajax

    如果你用過Asp.net webform, 說明你也算是.NET 開發的老兵了。WEBform應該是2011 2013左右,當時還用visual studio 2005、 visual studio 2008。后來基本都用的是MVC。 如果是新開發的專案,估計沒人會用webform技術。但是有些舊版 ......

    uj5u.com 2020-09-09 22:08:50 more
  • iis添加asp.net網站,訪問提示:由于擴展配置問題而無法提供您請求的

    今天在iis服務器配置asp.net網站,遇到一個問題,記錄一下: 問題:由于擴展配置問題而無法提供您請求的頁面。如果該頁面是腳本,請添加處理程式。如果應下載檔案,請添加 MIME 映射。 WindowServer2012服務器,添加角色安裝完.netframework和iis之后,運行aspx頁面 ......

    uj5u.com 2020-09-09 22:10:00 more
  • WebAPI-處理架構

    帶著問題去思考,大家好! 問題1:HTTP請求和回傳相應的HTTP回應資訊之間發生了什么? 1:首先是最底層,托管層,位于WebAPI和底層HTTP堆疊之間 2:其次是 訊息處理程式管道層,這里比如日志和快取。OWIN的參考是將訊息處理程式管道的一些功能下移到堆疊下端的OWIN中間件了。 3:控制器處理 ......

    uj5u.com 2020-09-09 22:11:13 more
  • 微信門戶開發框架-使用指導說明書

    微信門戶應用管理系統,采用基于 MVC + Bootstrap + Ajax + Enterprise Library的技術路線,界面層采用Boostrap + Metronic組合的前端框架,資料訪問層支持Oracle、SQLServer、MySQL、PostgreSQL等資料庫。框架以MVC5,... ......

    uj5u.com 2020-09-09 22:15:18 more
  • WebAPI-HTTP編程模型

    帶著問題去思考,大家好!它是什么?它包含什么?它能干什么? 訊息 HTTP編程模型的核心就是訊息抽象,表示為:HttPRequestMessage,HttpResponseMessage.用于客戶端和服務端之間交換請求和回應訊息。 HttpMethod類包含了一組靜態屬性: private stat ......

    uj5u.com 2020-09-09 22:15:23 more
  • 部署WebApi隨筆

    一、跨域 NuGet參考Microsoft.AspNet.WebApi.Cors WebApiConfig.cs中配置: // Web API 配置和服務 config.EnableCors(new EnableCorsAttribute("*", "*", "*")); 二、清除默認回傳XML格式 ......

    uj5u.com 2020-09-09 22:15:48 more
最新发布
  • C#多執行緒學習(二) 如何操縱一個執行緒

    <a href="https://www.cnblogs.com/x-zhi/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2943582/20220801082530.png" alt="" /></...

    uj5u.com 2023-04-19 09:17:20 more
  • C#多執行緒學習(二) 如何操縱一個執行緒

    C#多執行緒學習(二) 如何操縱一個執行緒 執行緒學習第一篇:C#多執行緒學習(一) 多執行緒的相關概念 下面我們就動手來創建一個執行緒,使用Thread類創建執行緒時,只需提供執行緒入口即可。(執行緒入口使程式知道該讓這個執行緒干什么事) 在C#中,執行緒入口是通過ThreadStart代理(delegate)來提供的 ......

    uj5u.com 2023-04-19 09:16:49 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    <a href="https://www.cnblogs.com/huangxincheng/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/214741/20200614104537.png" alt="" /&g...

    uj5u.com 2023-04-18 08:39:04 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    一:背景 1. 講故事 前段時間協助訓練營里的一位朋友分析了一個程式卡死的問題,回過頭來看這個案例比較經典,這篇稍微整理一下供后來者少踩坑吧。 二:WinDbg 分析 1. 為什么會卡死 因為是表單程式,理所當然就是看主執行緒此時正在做什么? 可以用 ~0s ; k 看一下便知。 0:000> k # ......

    uj5u.com 2023-04-18 08:33:10 more
  • SignalR, No Connection with that ID,IIS

    <a href="https://www.cnblogs.com/smartstar/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/u36196.jpg" alt="" /></a>...

    uj5u.com 2023-03-30 17:21:52 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:15:33 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:13:31 more
  • C#遍歷指定檔案夾中所有檔案的3種方法

    <a href="https://www.cnblogs.com/xbhp/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/957602/20230310105611.png" alt="" /></a&...

    uj5u.com 2023-03-27 14:46:55 more
  • C#/VB.NET:如何將PDF轉為PDF/A

    <a href="https://www.cnblogs.com/Carina-baby/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2859233/20220427162558.png" alt="" />...

    uj5u.com 2023-03-27 14:46:35 more
  • 武裝你的WEBAPI-OData聚合查詢

    <a href="https://www.cnblogs.com/podolski/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/616093/20140323000327.png" alt="" /><...

    uj5u.com 2023-03-27 14:46:16 more