1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have 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');

####説明
https://www.npmjs.com/package/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までの相対パスを通すとエラーが起きます。
読み込み方法がわかる方ご教授ください。

####参考
https://qiita.com/yamachu/items/36da0b89f8ba75143643

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?