Skip to content

Commit

Permalink
Build as Self Contained and Selfhost CefSharp SubProcess (#693)
Browse files Browse the repository at this point in the history
* Added self contained parameter to builds

* Remove dotnet install from installer

* Fixed missing SubProcessExe

* Self hot browser subprocess

---------

Co-authored-by: Natsumi <cmcooper123@hotmail.com>
  • Loading branch information
DubyaDude and Natsumi-sama authored Dec 4, 2023
1 parent 312519b commit f053f2b
Show file tree
Hide file tree
Showing 7 changed files with 61 additions and 21 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/github_actions.yml
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ jobs:
run: cd ${{ github.workspace }}/html && npm run production && cd ${{ github.workspace }}

- name: Build .NET Application
run: dotnet build -p:Configuration=Release -p:Platform=x64 -p:EnableWindowsTargeting=true
run: dotnet build -p:Configuration=Release -p:Platform=x64 -p:EnableWindowsTargeting=true --self-contained

- name: Copy Web UI
run: cp -r ${{ github.workspace }}/html/dist ${{ github.workspace }}/bin/x64/Release/html
Expand Down
5 changes: 3 additions & 2 deletions Dotnet/Cef/CefService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,8 @@ internal void Init()
WindowlessRenderingEnabled = true,
PersistSessionCookies = true,
PersistUserPreferences = true,
UserAgent = Program.Version
UserAgent = Program.Version,
BrowserSubprocessPath = Environment.ProcessPath
};

cefSettings.RegisterScheme(new CefCustomScheme
Expand Down Expand Up @@ -59,7 +60,7 @@ internal void Init()
//CefSharpSettings.WcfEnabled = true; // TOOD: REMOVE THIS LINE YO (needed for synchronous configRepository)
CefSharpSettings.ShutdownOnExit = false;

if (Cef.Initialize(cefSettings) == false)
if (Cef.Initialize(cefSettings, false) == false)
{
throw new Exception("Cef.Initialize()");
}
Expand Down
54 changes: 54 additions & 0 deletions Dotnet/Cef/SubProcess.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
using CefSharp.Internals;
using System;
using System.IO;

namespace VRCX;

public class BrowserSubprocess
{
/// <summary>
/// This function should be called from the application entry point function (typically Program.Main)
/// to execute a secondary process e.g. gpu, renderer, utility
/// This overload is specifically used for .Net Core. For hosting your own BrowserSubProcess
/// it's preferable to use the Main method provided by this class.
/// - Pass in command line args
/// </summary>
/// <param name="args">command line args</param>
/// <returns>
/// If called for the browser process (identified by no "type" command-line value) it will return immediately
/// with a value of -1. If called for a recognized secondary process it will block until the process should exit
/// and then return the process exit code.
/// </returns>
public static void Start()
{
var args = Environment.GetCommandLineArgs();
var type = CommandLineArgsParser.GetArgumentValue(args, CefSharpArguments.SubProcessTypeArgument);

if (string.IsNullOrEmpty(type))
{
// If --type param missing from command line CEF/Chromium assums
// this is the main process (as all subprocesses must have a type param).
return;
}

var browserSubprocessDllPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "CefSharp.BrowserSubprocess.Core.dll");
if (!File.Exists(browserSubprocessDllPath))
{
browserSubprocessDllPath = Path.Combine(Path.GetDirectoryName(typeof(CefSharp.Core.BrowserSettings).Assembly.Location), "CefSharp.BrowserSubprocess.Core.dll");
}
var browserSubprocessDll = System.Runtime.Loader.AssemblyLoadContext.Default.LoadFromAssemblyPath(browserSubprocessDllPath);
var browserSubprocessExecutableType = browserSubprocessDll.GetType("CefSharp.BrowserSubprocess.BrowserSubprocessExecutable");

var browserSubprocessExecutable = Activator.CreateInstance(browserSubprocessExecutableType);

var mainMethod = browserSubprocessExecutableType.GetMethod("MainSelfHost", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public);
var argCount = mainMethod.GetParameters();

var methodArgs = new object[] { args };

var exitCode = mainMethod.Invoke(null, methodArgs);

Environment.Exit((int)exitCode);
}
}

1 change: 1 addition & 0 deletions Dotnet/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,7 @@ private static void GetVersion()

private static void Run()
{
BrowserSubprocess.Start();
Update.Check();
StartupArgs.ArgsCheck();
GetVersion();
Expand Down
16 changes: 0 additions & 16 deletions Installer/installer.nsi
Original file line number Diff line number Diff line change
Expand Up @@ -118,20 +118,6 @@ Function .onInit
done:
FunctionEnd

Function CheckAndInstallDotNet
nsExec::ExecToStack /OEM 'cmd /c dir "%windir%\system32" | dotnet --list-runtimes | find /c /i "Microsoft.NETCore.App 8"'
Pop $0
Pop $1
StrCpy $2 $1 1
StrCmp $2 "1" 0 version_not_found
goto version_found
version_not_found:
inetc::get "https://aka.ms/dotnet/8.0/windowsdesktop-runtime-win-x64.exe" $TEMP\dotnet-runtime-win-x64.exe
ExecWait "$TEMP\dotnet-runtime-win-x64.exe /install /quiet /norestart"
Delete "$TEMP\dotnet-runtime-win-x64.exe"
version_found:
FunctionEnd

Function createDesktopShortcut
CreateShortcut "$DESKTOP\VRCX.lnk" "$INSTDIR\VRCX.exe"
FunctionEnd
Expand Down Expand Up @@ -164,8 +150,6 @@ Section "Install" SecInstall
Delete "$TEMP\vcredist_x64.exe"
VSRedistInstalled:

Call CheckAndInstallDotNet

SetOutPath "$INSTDIR"

File /r /x *.log /x *.pdb "..\bin\x64\Release\*.*"
Expand Down
2 changes: 1 addition & 1 deletion build-all.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ $ZipName = "VRCX_" + $Date + ".zip"
$SetupName = "VRCX_" + $Date + "_Setup.exe"

Write-Host "Building .Net..." -ForegroundColor Green
msbuild VRCX.sln -p:Configuration=Release -p:Platform=x64 -p:RestorePackagesConfig=true -t:"Restore;Clean;Build" -m
dotnet build VRCX.sln -p:Configuration=Release -p:Platform=x64 -p:RestorePackagesConfig=true -t:"Restore;Clean;Build" -m --self-contained

Write-Host "Building Node.js..." -ForegroundColor Green
cd "html"
Expand Down
2 changes: 1 addition & 1 deletion build-dotnet.cmd
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
@echo off
dotnet build VRCX.sln -p:Configuration=Release -p:Platform=x64 -p:RestorePackagesConfig=true -t:"Restore;Clean;Build" -m
dotnet build VRCX.sln -p:Configuration=Release -p:Platform=x64 -p:RestorePackagesConfig=true -t:"Restore;Clean;Build" -m --self-contained
mklink /J "%~dp0\bin\x64\Release\html" "%~dp0\html\dist"
pause

0 comments on commit f053f2b

Please sign in to comment.