Skip to content

提示

使用 electron-edge-js 调用 .net standard 或者 .net core 的 dll 中的方法

1. 客户端安装

当前版本 12.4.0

bash
yarn add electron-edge-js

2. 新建.net 的 dll

2.1 .netcore 版本

  • .net core 的版本可以选择 2.0,2.1,2.2,3.0
  • 添加项目引用 2019-10-14-20191014125715.png
  • 代码
csharp
using System.Threading.Tasks;
using ExternalLibrary;
using Newtonsoft.Json;

namespace QuickStart.Core
{
    class ExternalMethods
    {
        private readonly Library _library = new Library();

        public async Task<object> GetPersonInfo(dynamic input)
        {
            return await Task.Run(() =>JsonConvert.SerializeObject(_library.GetPerson(), Formatting.Indented));
        }
    }
}
csharp
using System;
using System.Threading.Tasks;

namespace QuickStart.Core
{
    public class LocalMethods
    {
        public async Task<object> GetAppDomainDirectory(dynamic input)
        {
            return await Task.Run(() => AppDomain.CurrentDomain.BaseDirectory);
        }

        public async Task<object> GetCurrentTime(dynamic input)
        {
            return await Task.Run(() => DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
        }

        public async Task<object> UseDynamicInput(dynamic input)
        {
            return await Task.Run(() => $".NET Core welcomes {input}");
        }
    }
}

2.2 net standard

  • .net standard 的版本可以选择 2.0
  • .net standard 的版本 2.1 目前不支持
  • 添加项目引用 2019-10-14-20191014131947.png
  • 代码

方法必须是异步的 参数是 dynamic 类型 方法返回 Task<object> object 可以为 string 或者 json

csharp
using System.Threading.Tasks;
using ExternlaLibrary.Standard;
using Newtonsoft.Json;

namespace QuickStart.Standard
{
    class ExternalMethods
    {
        private readonly Library _library = new Library();

        public async Task<object> GetPersonInfo(dynamic input)
        {
            return await Task.Run(() =>JsonConvert.SerializeObject(_library.GetPerson(), Formatting.Indented));
        }
    }
}
csharp
using System;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;

namespace QuickStart.Standard
{
    public class LocalMethods
    {
        public async Task<object> GetAppDomainDirectory(dynamic input)
        {
            return await Task.Run(() => AppDomain.CurrentDomain.BaseDirectory);
        }

        public async Task<object> GetCurrentTime(dynamic input)
        {
            return await Task.Run(() => DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
        }

        public async Task<object> UseDynamicInput(dynamic input)
        {
            return await Task.Run(() => $".NET Standard welcomes {input}");
        }
    }
}

3. 客户端的调用

3.1 环境变量配置 配置在前端部分 不是配置在 electron 的启动部分

javascript
var oldversion = location.search.split("version=")[1];
var version = "";
var namespace =
  "QuickStart." + oldversion.charAt(0).toUpperCase() + oldversion.substr(1);

if (oldversion === "core") {
  version = oldversion + "app" + "3.0";
} else {
  version = oldversion + "2.1";
}

// dll 所在的目录
const baseNetAppPath = path.join(
  __dirname,
  "/src/" + namespace + "/bin/Debug/net" + version
);

// .netcore  需要设置 process.env.EDGE_USE_CORECLR = 1
if (oldversion !== "standard") {
  process.env.EDGE_USE_CORECLR = 1;
}
// 设置edge 调用 c# 程序的的所在目录
process.env.EDGE_APP_ROOT = baseNetAppPath;

3.2 js 对 c# 中方法的调用

javascript
var edge = require("electron-edge-js");

var baseDll = path.join(baseNetAppPath, namespace + ".dll");

var localTypeName = namespace + ".LocalMethods";
var externalTypeName = namespace + ".ExternalMethods";

//对方法的调用相当于自动new了一个类 这个类是无参的类
var getAppDomainDirectory = edge.func({
  assemblyFile: baseDll,
  typeName: localTypeName,
  methodName: "GetAppDomainDirectory"
});

var getCurrentTime = edge.func({
  assemblyFile: baseDll,
  typeName: localTypeName,
  methodName: "GetCurrentTime"
});

var useDynamicInput = edge.func({
  assemblyFile: baseDll,
  typeName: localTypeName,
  methodName: "UseDynamicInput"
});

var getPerson = edge.func({
  assemblyFile: baseDll,
  typeName: externalTypeName,
  methodName: "GetPersonInfo"
});

window.onload = function() {
  document.getElementById("baseDll").innerHTML = baseDll;

  //第一个参数是传入到c#中的参数
  getAppDomainDirectory("", function(error, result) {
    if (error) throw error;
    document.getElementById("GetAppDomainDirectory").innerHTML = result;
  });

  getCurrentTime("", function(error, result) {
    if (error) throw error;
    document.getElementById("GetCurrentTime").innerHTML = result;
  });

  useDynamicInput("Node.Js", function(error, result) {
    if (error) throw error;
    document.getElementById("UseDynamicInput").innerHTML = result;
  });

  getPerson("", function(error, result) {
    //if (error) throw JSON.stringify(error);
    document.getElementById("GetPersonInfo").innerHTML = result;
  });
};
发布日期: 2019/10/14
标签: studystudy.electron

最后更新: