我在 WPF 中使用 CefSharp 55。每次新建ChromiumWebBrowser一个,任务管理器中都会出现一个新的CefSharp.BrowserSubprocess.exe,这是正常的。但是,他们当我打电话不会消失Dispose()在ChromiumWebBrowser。它们只有在我关闭应用程序时才会消失,可能是因为当时我打电话给Cef.Shutdown(). 我试图在处置后强制 GC,但我什么也没改变。
因此,如果用户在 Web 浏览器中不断打开和关闭选项卡,我们最终会运行很多 CefSharp.BrowserSubprocess,它们永远不会在应用程序关闭时关闭。
在扩展类的构造函数中ChromiumWebBrowser,我做
var requestContextSettings = new RequestContextSettings
{
PersistSessionCookies = false,
IgnoreCertificateErrors = true
};
RequestContext = new RequestContext(requestContextSettings);
Run Code Online (Sandbox Code Playgroud)
当我处理浏览器时,请执行
browser.Dispose();
browser.RequestContext.Dispose()
Run Code Online (Sandbox Code Playgroud)
我忘记了什么吗?
编辑
显然,问题不仅限于 CefSharp.BrowserSubprocess。当我处理播放 youtube 视频的浏览器时,视频的声音仍在运行。之前是正常的,处理后视频声音被剪掉了。也许是我最近更新的新版 CefSharp 中的一个错误。
我有一些本机 dll,必须根据平台条件将其复制到 bin 文件夹中。我希望将它们复制到引用该项目的项目的 bin 文件夹中。
如果我将构建操作设置为Content,它们将被复制到 bin 文件夹,但保留文件夹结构,因此它们不会位于 bin 文件夹中,而是位于子文件夹中。因此,当运行程序时,它将无法解析 dll,因为它们位于子文件夹中。
例如,如果我的项目文件中有此代码
<Choose>
<When Condition=" '$(Platform)'=='x86' ">
<ItemGroup>
<Content Include="nativedll\somelib\x86\somelib.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
</When>
<When Condition=" '$(Platform)'=='x64' ">
<ItemGroup>
<Content Include="nativedll\somelib\x64\somelib.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
</When>
</Choose>
Run Code Online (Sandbox Code Playgroud)
bin\nativedll\somelib\x86\somelib.dll如果是 x86,该 dll 将位于该文件夹中。
所以我尝试使用构建后脚本
<PostBuildEvent>
IF "$(Platform)" == "x86" (
xcopy /s /y "$(ProjectDir)\nativedll\somelib\x86" "$(TargetDir)"
)
IF "$(Platform)" == "x64" (
xcopy /s /y "$(ProjectDir)\nativedll\somelib\x64" "$(TargetDir)"
)
</PostBuildEvent>
Run Code Online (Sandbox Code Playgroud)
但是 dll 被复制到项目的 bin 文件夹中,而不是复制到引用它的项目的 bin 文件夹中。
所以我现在的解决方案是在使用此脚本的所有项目中添加一个构建后脚本。
在 Visual Studio …