LoginSignup
1
2

More than 1 year has passed since last update.

C#とNode.jsを連携する

Last updated at Posted at 2021-10-16

C#とNode.jsを連携する

追記

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#のメソッドを実行しデーターを渡します
Screenshot from 2021-10-16 22-23-45.png

edgeJsライブラリ

現在は更新されていません。メンテナンスを引き継いだプロジェクトが別にあります。

npm install edge

edgeで読み込む

const edge = require('edge');

フォークされたもの

現在も保守されている

npm install edge-js

edgeの後ろに-jsを付ける

const edge = require('edge-js');

説明

Node.jsにインストールされたモジュールを表示する
npm list
npm -v

環境構築

DockerFileの内容をみて必要なライブラリをインストールします。
Monoは必要ないです。

RiderのエディタからedgeJSモージュールをインストールする

npm install後にエディタ上で
波線をクリックするとnode_moduleフォルダが生成され、edgeモジュールがインストールされる

Screenshot from 2021-10-16 21-54-49.png

動作に必要な設定

コマンド 有無 備考
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で設定します。
Screenshot from 2021-10-16 21-31-35.png

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ファイルがあり、いろいろ試せます。

Screenshot from 2021-10-16 22-47-09.png

デバッグ 3種類

C#側のデバッグ

実行ボタンでデバッグ
Screenshot from 2021-10-16 21-55-00.png
エラーが緑文字で出る。C#側のCSファイルビルド状態、Dllファイルが読み込まれたかどうか Dllファイルがあるかアセンブリが読み込まれたかどうかなどいろいろ確認できます。
Screenshot from 2021-10-16 21-55-52.png

Node.js側のデバッグ

虫のアイコンでNode.js側がデバッグできます。Js側でブレイクポイントなどをしてデバッグします。
Screenshot from 2021-10-16 21-55-09.png
edge.jsを追加するとブレイクポイントでデバッグできるようになる
Screenshot from 2021-10-16 21-57-26.png
ブレイクポイント追加する
Screenshot from 2021-10-16 21-56-54.png

Debugger ConsoleとProcess Consoleでエラーログを見ることができます。
Screenshot from 2021-10-17 16-07-03.png

よく出るエラー

Uncaught TypeError: edge.initializeClrFunc is not a function

Screenshot from 2021-10-16 22-56-11.png
Screenshot from 2021-10-16 22-54-51.png
一見JavaScript側のエラーのように見えるがC#側のエラーであることが多いです。C#側を確認するとよいです。

Error occurred during CoreCLR initialization
node:internal/modules/cjs/loader:1168
return process.dlopen(module, path.toNamespacedPath(filename));

Screenshot from 2021-10-17 16-38-29.png
パスのどれかに絶対パスが含まれていると出るエラーになります。相対パスに直すと通ります。
環境変数の設定などで起きる

ダイナミックライブラリの中に外部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を追加できます
Screenshot from 2021-10-16 22-45-40.png

Publishを設定する

Publishを実行すると依存ファイル(dllなど)、Nugetから入れたDLLをすべて同じフォルダに書き出せます。
Screenshot from 2021-10-16 22-26-05.png

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までの相対パスを通すとエラーが起きます。
読み込み方法がわかる方ご教授ください。

参考

EdgeJsをC#のソースコードからデバッグするに続く

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2