###C#とNode.jsを連携する
追記
####EdgeJsを利用する
EdgeJsを利用しNode.jsからC#通信ができます。その逆もできます。.net4.6のみ。まだ.netCoreには未対応のようです。
#####Node.js側
const edge = require('edge-js');
const helloWorld = edge.func('cs', function () {/*
async (input) => {
return ".NET Welcomes " + input.ToString();
}
*/});
helloWorld('Node.js', function (error, result) {
if (error) throw error;
console.log(result);
});
#####C#側
NodeJsからC#のメソッドを実行しデーターを渡します
####edgeJsライブラリ
現在は更新されていません。メンテナンスを引き継いだプロジェクトが別にあります。
npm install edge
edgeで読み込む
const edge = require('edge');
####フォークされたもの
現在も保守されている
npm install edge-js
edgeの後ろに-jsを付ける
const edge = require('edge-js');
####説明
https://www.npmjs.com/package/edge-js
#####Node.jsにインストールされたモジュールを表示する
npm list
npm -v
####環境構築
DockerFileの内容をみて必要なライブラリをインストールします。
Monoは必要ないです。
####RiderのエディタからedgeJSモージュールをインストールする
npm install後にエディタ上で
波線をクリックするとnode_moduleフォルダが生成され、edgeモジュールがインストールされる
####動作に必要な設定
コマンド | 有無 | 値 | 備考 |
---|---|---|---|
EDGE_USE_CORECLR | 必須 | 1 | .NetCore用のedgeモジュールを利用する |
EDGE_NATIVE | 必須 | edge-js/build/Release/edge_coreclr.node | 相対パスで設定する 絶対パスだとエラーが出る |
EDGE_DEBUG | オプション | 1 | デバッグ表示 |
EDGE_APP_ROOT | オプション | Publishフォルダへのパス | 外部Dll Nugetライブラリを利用する時に使う 相対パスで設定する |
####環境変数の設定の仕方
#####ターミナルから設定し実行する
EDGE_NATIVE=edge-js/build/Release/edge_coreclr.node EDGE_USE_CORECLR=1 EDGE_DEBUG=1 node test.js
#####RiderのNode.js設定画面から設定する
EnviromentValueで設定します。
#####JSプログラムの中に書く
var path = require('path');
const baseNetAppPath = path.join(__dirname, '/bin/Release/netstandard2.0/publish/');
process.env.EDGE_USE_CORECLR = 1;
process.env.EDGE_DEBUG=1;
process.env.EDGE_NATIVE='edge-js/build/Release/edge_coreclr.node';
//process.env.EDGE_APP_ROOT = baseNetAppPath;
var edge = require('edge-js');
####サンプルを実行
node_modules/edge-jsフォルダの中にSampleファイルがあり、いろいろ試せます。
####デバッグ 3種類
####C#側のデバッグ
実行ボタンでデバッグ
エラーが緑文字で出る。C#側のCSファイルビルド状態、Dllファイルが読み込まれたかどうか Dllファイルがあるかアセンブリが読み込まれたかどうかなどいろいろ確認できます。
#####Node.js側のデバッグ
虫のアイコンでNode.js側がデバッグできます。Js側でブレイクポイントなどをしてデバッグします。
edge.jsを追加するとブレイクポイントでデバッグできるようになる
ブレイクポイント追加する
Debugger ConsoleとProcess Consoleでエラーログを見ることができます。
####よく出るエラー
Uncaught TypeError: edge.initializeClrFunc is not a function
Error occurred during CoreCLR initialization
node:internal/modules/cjs/loader:1168
return process.dlopen(module, path.toNamespacedPath(filename));
###ダイナミックライブラリの中に外部DllやNugetライブラリを利用する設定
プロジェクトフォルダに以下の値を追加する。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp2.0</TargetFramework>
<PreserveCompilationContext>true</PreserveCompilationContext>
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
</PropertyGroup>
<ItemGroup>
<Reference Include="EdgeJs">
<HintPath>..\..\node_modules\edge-js\lib\bootstrap\bin\Release\netcoreapp1.1\EdgeJs.dll</HintPath>
<Private>true</Private>
</Reference>
</ItemGroup>
</Project>
.NET5のところをクリックしAdd FromからもDllを追加できます
####Publishを設定する
Publishを実行すると依存ファイル(dllなど)、Nugetから入れたDLLをすべて同じフォルダに書き出せます。
Publishフォルダへパスを通す。相対がよいです。
process.env.EDGE_APP_ROOT = '';
####Nugetから必要ライブラリをインストール
Microsoft.NETCore.DotNetHost
Microsoft.NETCore.DotNetHostPolicy
このライブラリには既に依存ファイルが設定されています
####現在の状態 Dllファイルへのアクセス
サンプルファイルのDllへはアクセスができましたが、DLLプログラムのの中にNugetのライブラリを入れると読み込まれない状態です。
DapperやMicoroSoftのSqliteライブラリなどが読み込まれない。NewtonSoftのJesonのライブラリは読み込め使えました。
EDGE_APP_ROOTにPublishまでの相対パスを通すとエラーが起きます。
読み込み方法がわかる方ご教授ください。