我已经在CefSharp WinForms应用程序上工作了几周,但我对此没有任何问题。今天早上,在向应用程序添加一些内容的同时,我尝试运行它以测试某些内容并得到以下错误:
未处理System.IO.FileNotFoundException消息:mscorlib.dll中发生了'System.IO.FileNotFoundException'类型的未处理异常。其他信息:无法加载文件或程序集'CefSharp.Core.dll'或其依赖项之一。指定的模块无法找到。
搜索一段时间后,我发现了这一点:
https://github.com/cefsharp/CefSharp/wiki/Frequently-asked-questions#Runtime_dependencies
我检查了bin / Debug / x86中的项目,似乎所有依赖项都存在。更重要的是,它在五分钟前运行良好,对于Entity Framework迁移,我只接触了一个类。
我曾尝试清洁和重建解决方案,重新启动Visual Studio,重新启动PC并清除/ bin / Debug,但这些都无济于事。
为什么几天后没有出现此错误,我该如何解决该问题?
编辑:我做了一些进一步的实验,我能够使应用程序在发布模式下运行,但不能在调试模式下运行。如果我将“发布”模式的输出路径更改为“调试”,则它会失败,并显示相同的错误(同样,它会在“调试”中使用“发布”输出路径成功)。
我在我正在构建的应用程序中有一个页面.该页面包含一些零碎,然后是部分视图,根据从下拉列表中选择的内容加载不同的视图.下拉列表中的每个选项都有一个与之关联的不同视图,每个视图都有自己的字段和模型.
无论视图是什么加载,我都在执行相同的操作 - 我正在序列化模型并将XML存储在数据库中.情况总是如此,并且没有基于视图/模型的唯一处理(除了字段不同的事实).所有模型都继承自相同的基类以进行序列化.
我希望能够做到这样的事情:
public ActionResult SubmitPartialView<T>(T model)
{
BaseClass baseClassModel = (BaseClass)(object)model;
// serialize and save to database
}
Run Code Online (Sandbox Code Playgroud)
但MVC不允许这样做 - "无法在控制器上调用操作,因为操作是一种通用方法".
如果我尝试将BaseClass作为参数本身传递,它只包含基类的属性,因此不包含模型的属性.
除了为每个可以提交的视图创建单独的操作,并且让每个视图调用一个处理逻辑的单独方法之外,没有其他选择吗?
我有一个 winforms 应用程序,它有一个 ChromiumWebBrowser 控件和一些基本的 Windows 控件。我希望能够单击一个按钮,调用 javascript 以获取浏览器中文本框的值,并将返回的值复制到 winforms 应用程序中的文本框。这是我的代码:
string script = "(function() {return document.getElementById('Email');})();";
string returnValue = "";
var task = browser.EvaluateScriptAsync(script, new { });
await task.ContinueWith(t =>
{
if (!t.IsFaulted)
{
var response = t.Result;
if (response.Success && response.Result != null)
{
returnValue = (string)response.Result;
}
}
});
txtTarget.Text = returnValue;
Run Code Online (Sandbox Code Playgroud)
然而,返回的结果只是“{}”。我已经在 Chrome 中加载了相同的网页并在开发工具中执行了相同的 javascript,我得到了预期的文本框值。
我查看的演示有示例代码,只是“返回 1+1;”,当我尝试返回值“2”而不是“{}”时。有趣的是,当我尝试
string script = "(function() {return 'hello';})()";
Run Code Online (Sandbox Code Playgroud)
我仍然收到“{}”,几乎好像这不适用于字符串。
我一直在挠头一段时间,一直无法弄清楚如何解决这个问题。我是在犯一个非常基本的语法错误还是有更复杂的事情发生?
我是新手使用异步方法,所以我觉得我误解了一些东西.我有一个带按钮的WinForms应用程序,当单击该按钮时,会调用异步方法.这必须是异步的,因为我需要对Chromium Web Browser控件进行javascript调用(使用CefSharp).我需要确保此javascript已完成运行并且浏览器已更新,然后继续使用该方法的下一部分.
我基本上试图将整个网页捕获为单个图像.我的方法是使用javascript更新页面上的滚动位置,然后使用Graphics.CopyFromScreen在每个位置截取屏幕截图.这主要是有效的,但偶尔产生的图像将具有错误的网页"块"(例如,第一个位图重复两次).这是我的代码:
// Calculate screen sizes, screenshot spacing etc.
for (int i = 0; i < screenshotCount; i++)
{
int scrollSize = i == 0 ? -PageHeight : (int)browserControlHeight;
string script = "(function() { window.scrollBy(0, " + scrollSize.ToString() + ") })();";
await browser.EvaluateScriptAsync(script);
// Take screenshot, add to list of bitmaps
}
// Combine resulting list of bitmaps
Run Code Online (Sandbox Code Playgroud)
如果我添加以下内容
await Task.Delay(1000);
Run Code Online (Sandbox Code Playgroud)
在EvaluateScriptAsync()调用之后,每次最终图像都是正确的.我正在假设javascript被调用但在截图开始之前没有完成.如果是这种情况,即使添加延迟也可能不起作用(如果javascript运行的时间超过一秒,该怎么办?).
我是否误解了async/await的工作方式?