在NanUI官方的文档中,是有一个NanUI.FileResourceHandler的扩展包的,但现在只有0.88版本中有一个NanUI.LocalFileResource程序包,而0.77版本只剩下了一个读取嵌入式资源的程序包。
参考:https://www.cnblogs.com/linxuanchen/p/the-nanui-0-7-release-notes.html
在扩展功能之前,请参考https://zhuanlan.zhihu.com/p/109023019 ,我参考这个帖子进行扩展的,也不知道改的对不对,总之功能是实现了。
然后将NanUI0.77源码拷贝到你的项目中,将源码中的Resources.Designer.cs代码复制到你项目中的Resources.Designer.cs 中,同时将源码中的Resources文件夹拷贝到你的项目中。
点击添加资源,将Resources文件夹所有文件选中,然后添加,就如下图所示。
这些资源是用来显示浏览器的控制台的,在这里我不做过多介绍。
如果你的源码正常运行,成功显示页面和控制台,js调用c# ,和c#调用js都正常,说明各方面搭建成功,可以开始下面的步骤。
我项目结构如下图,部分文件夹是我自己加的
打开ResourceHandlerRegister.cs ,没有这个脚本可以自己新建,这里我是导入了官方的嵌入式资源源码,所以已经有这个脚本了,这些源码可以搜索作者的github就可以下载了。
using System;
namespace NetDimension.NanUI
{
public static class ResourceHandlerRegister
{
//读取嵌入式资源
//参考:https://zhuanlan.zhihu.com/p/109022286
public static Bootstrap UseAssembledResource(this Bootstrap _, ResourceHandlerScheme scheme, string domain, string basePath = null)
{
//GC.Collect();
Bootstrap.RegisterCustomResourceHandler(() => new AssembledResource(scheme, domain, basePath));
return _;
}
//REST资源处理器
//参考:https://zhuanlan.zhihu.com/p/109023845
public static Bootstrap UseRestfulService(this Bootstrap _, ResourceHandlerScheme scheme, string domain, Action<RestfulService.RestfulServiceProvider> provider = null)
{
//GC.Collect();
Bootstrap.RegisterCustomResourceHandler(() =>
{
var resourceHandler = new RestfulServiceResource(scheme, domain);
provider?.Invoke(RestfulService.RestfulServiceProvider.Create(resourceHandler));
return resourceHandler;
});
return _;
}
//读取本地资源目录
//参考:https://zhuanlan.zhihu.com/p/109023019
public static Bootstrap UseClockResourceHandler(this Bootstrap _, ResourceHandlerScheme scheme, string domain, string filePath)// 如果您的资源处理器有其他参数,参数表因添加在末尾处)
{
//GC.Collect();
Bootstrap.RegisterCustomResourceHandler(() => new CustomResourceFactory(scheme, domain, filePath));
return _;
}
}
}
新建脚本 CustomResourceFactory.cs
using Chromium;
using NetDimension.NanUI.ResourceHandler;
namespace NetDimension.NanUI
{
public class CustomResourceFactory : CustomResource
{
private string ViewFolder = string.Empty;
public CustomResourceFactory(ResourceHandlerScheme scheme, string domain,string viewFolder)
: base(scheme, domain)
{
ViewFolder = viewFolder;
}
protected override ResourceHandlerBase GetResourceHandler(string schemeName, CfxBrowser browser, CfxFrame frame, CfxRequest request)
{
return new CustomResourceHandler(ViewFolder);
}
}
}
新建脚本 CustomResourceHandler.cs
using Chromium;
using NetDimension.NanUI.ResourceHandler;
using System;
using System.Collections.Generic;
using System.IO;
namespace NetDimension.NanUI
{
public class CustomResourceHandler : ResourceHandlerBase
{
private List<string> FilesinfoList = new List<string>();
protected override FormiumResponse GetResponse(FormiumRequest request)
{
FormiumResponse response = new FormiumResponse();
if (request.Method != Method.GET)
{
response.Status = (int)System.Net.HttpStatusCode.NotFound;
return response;
}
string physicalFilePath = string.Empty;
if (FilesinfoList.Count > 0)
{
string[] sArr = request.RequestUrl.Split('/');
if(sArr.Length > 2)
{
string fileName = sArr[sArr.Length - 1];
for (int i = 0; i < FilesinfoList.Count; i++)
{
string _FileName = System.IO.Path.GetFileName(FilesinfoList[i]);
if (_FileName.Equals(fileName))
{
physicalFilePath = FilesinfoList[i];
break;
}
}
}
}
else
{
response.Status = (int)System.Net.HttpStatusCode.NotFound;
return response;
}
if (File.Exists(physicalFilePath))
{
response.ContentStream = File.OpenRead(physicalFilePath);
response.MimeType = CfxRuntime.GetMimeType(Path.GetExtension(physicalFilePath).Trim('.')) ?? "text/plain";
}
else
{
response.Status = (int)System.Net.HttpStatusCode.NotFound;
}
return response;
}
private void GetDirectoryFileList(string path)
{
DirectoryInfo directory = new DirectoryInfo(path);
FileSystemInfo[] filesArray = directory.GetFileSystemInfos();
foreach (var item in filesArray)
{
if (item.Attributes == FileAttributes.Directory)
GetDirectoryFileList(item.FullName);
else
FilesinfoList.Add(item.FullName);
}
}
public CustomResourceHandler(string viewFolder)
{
string viewFullPath = Path.Combine(System.Windows.Forms.Application.StartupPath, viewFolder);
if (System.IO.Directory.Exists(viewFullPath))
GetDirectoryFileList(viewFullPath);
}
}
}
调用,Program.cs
using NetDimension.NanUI;
using System;
using System.Windows.Forms;
namespace NanUI077_SourceCode
{
static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Bootstrap
.Initialize()
//注册嵌入资源,并为指定资源指定一个假的域名www.app.local
//.UseAssembledResource(ResourceHandlerScheme.Http, "www.app.local", "View")
//读取本地资源
.UseClockResourceHandler(ResourceHandlerScheme.Http, "www.app.local", "View")
.WithChromiumCommandLineArguments((procesName, cmd) =>
{
// 在此处处理CEF的命令行参数
cmd.AppendSwitch("xxxxxx");
})
.WithChromiumSettings(settings =>
{
// 在此处处理CEF的设置
})
.WhenLibCefNotFound(args =>
{
// 如果NanUI启动器没有检测到正确的CEF以及ChromiumFX运行环境,将执行此处理过程。
MessageBox.Show("没有检测到Chromium Embedded运行环境,请确认libcef环境配置正确。", "libcef.dll is not found", MessageBoxButtons.OK, MessageBoxIcon.Error);
})
.Run(() =>
{
return new MainIndex();
});
}
}
}
MainIndex.cs 脚本看我其他帖子,已经写了很多遍了,这里不贴代码了。
fx文件夹是cef的资源文件夹,这个如果没有,去你其他的NanUI项目中拷贝过来,或者你自己生成资源。
在你的这个exe文件同级目录下,加入一个View文件夹,将web前端代码放进去就好了。
view文件夹
运行:
end