🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
DLL

DLL(Dynamic Link Library)とは、他のモジュールからも使用する事が出来る、関数とデータが格納されているモジュールのことです。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

7196閲覧

JavaScriptからC#もしくはC++のDLLのメソッドにアクセスしたい

nyatama

総合スコア2

DLL

DLL(Dynamic Link Library)とは、他のモジュールからも使用する事が出来る、関数とデータが格納されているモジュールのことです。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2020/12/21 07:05

編集2020/12/21 07:37

当方Mac環境ということが前提でお願いします。

RPGツクールMVというゲーム開発ソフトを使用していますが、
これに使われている言語がJavaScriptです。

このゲームと連動して実在のLEDを点灯させるということがしたいです。
そこでタートル工業というメーカーのTUSB-PIOという装置を使用して
リレー回路を作動させてLEDを点灯させることができました。
これは仮想OSにあるWindowsでVisualStudioというアプリを使用して行いました。

タートル工業のTUSB-PIOのマニュアルのURLは以下です。
http://www.turtle-ind.co.jp/03products_info/manual/TUSBPIO_M1.pdf

このマニュアルのドライバ関数リファレンスにあるTusbpio_Device_Openや
Tusbpio_Dev1_Writeといった関数がJavaScript上で処理できれば理想ですが
先ずDLLをMac上から認識できる必要があると思います。

このDLLを読み込むのに必要?なh(ヘッダ)ファイルはTUSB-PIOのサンプルプログラムに
含まれていましたがこれをツクールMVのプロジェクトルートに入れたほうが良いでしょうか?
DLLやhファイルはプロジェクトルートに入れるという認識は間違っていませんか?

そもそもMacはTUSB-PIOのドライバがありませんがドライバが無い場合は動作しないのでしょうか?
MacでJavaScriptからC#やC++でつくられたDLLを認識してツクールMVからLEDの制御を行いたいです。

ちなみにMac版VisualStudioではTUSB-PIOのサンプルプログラムを実行しようとしても
エラーしてしまい起動できませんでした。

特殊用途なのでこのような使い方する人はなかなかいないかもしれませんが
もしわかる方いたら教えてもらいたいです。

説明が下手なのでわかりづらかったらすみません。
JavaScriptとC++やC#との連携に詳しいかたいましたらぜひ教えていただきたいと思います。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/12/21 07:43 編集

JavaScriptとありますが、Webで動作するということでしょうか?動作環境を詳細に記入してください。 そもそも、DLLがC++製かC#製かで話はかなり変わってくるのですが、Windows用のC++製DLLはMacでは動かせないと思うのですが、Macで使用可能かどうかメーカーに確認はされたのでしょうか?
BluOxy

2020/12/21 10:09 編集

> Mac版VisualStudioではTUSB-PIOのサンプルプログラムを実行しようとしても エラーしてしまい起動できませんでした Macに対応していないdllであれば無理ではないでしょうか。どうしてもそのdllでないといけないのであれWindowsのPCを用意する必要があります。 編集:Windowsというより、そのdllが対応しているOSのPCを用意する が正しいです。Windowsも対応していなければ、WindowsのOSが入ったPCを使っても意味がありません。
nyatama

2020/12/21 07:53

お返事ありがとうございます。 動作環境は MacBookPro retina Mid 2012 OS:HighSierra 10.13.6 ツクールMV Version: 1.6.3 DLLはJavaScriptで呼べればどちらでも構いません。 Windows用のC#製DLLであれば動かせるということでしょうか? TUSB-PIOのドライバの動作環境にMacは含まれていませんでした。 ということはMacでは使えないということになりますか? WindowsにツクールMVをインストールすればJavaScript上から使えますでしょうか?
退会済みユーザー

退会済みユーザー

2020/12/21 08:21 編集

ツクールMVのJavaScriptの仕様がどうなってるかは不明ですが、一般的にはJavaScriptからはDLLの処理を直接呼び出す事は出来ないと考えてください。 既にBluOxyさんが回答しているように、DLLの処理を呼び出すWebAPIサーバを建てて、それをJavaScriptから呼びだす形になると思います。
dodox86

2020/12/21 10:17

最終的にmacOSでTUSB-PIOを使いたいということに行き着きますが、タートル工業さんの資料を見ると、特別なWindowsデバイスドライバーはインストールしていない様子であるものの、SDKで用意したC言語やVB6のプログラムからUSBデバイスを直接操作しているようにも思います。(バルク転送とか?分からないけど)いずれにせよデバイス独自の通信は行っているので、それをmacOS上で自力で実装できないと結局は使えません。ライセンスの問題は置いておいて、少なくともドライバーの自作が必要ですので、非現実的ですね。
nyatama

2020/12/22 00:10

了解致しました。Macでの開発は諦めいっそのこと仮想OSのWindowsにRPGツクールMVをインストールしてそちらで開発を行う方向に舵を切ろうと思います。ちなみに仮想OSはParallelsDesktop16forMacにて行っています。そちらにインストールされているWindows10でしたらTUSB-PIOのサンプルプログラムが動作したのでいけそうな気はしますがツクールからDLLを呼び出すにはやはりWebAPIサーバを建てるしかないのでしょうか?
dodox86

2020/12/22 01:41

なぜなんらかのWebAPIを提供するWEBサーバーを建てる必要があるかというと、WEBブラウザ上で動くJavaScriptではローカルPC上のリソースに直接アクセスできない為です。JavaScriptの仕様というよりはそれを使うOSやそれをホスティングするプラットフォーム上の制限です。Node.jsであれば同じJavaScriptでもローカルPC上のリソースにアクセスできます。お使いのRPGツクールMVの提供するJavaScript、プラグイン(?)環境がローカルPC上のOSのAPIやシステムコールにアクセスできない仕様なのであれば、既にコメント、回答をいただだいているようにホストPC上で動作するDLLとそのAPIの機能を仲介するWebAPIを作り、それを利用するしかないでしょう、ということです。もし、RPGツクールMVの提供するJavaScript環境のAPIがとても制限があり、自由にWEBサイトにアクセスできないような仕様だとやはり使えないということにもなります。その辺りはあらかじめ確認してください。
nyatama

2020/12/22 02:45

お世話になっております。成程、すごく勉強になります。 ということは即ちツクールMVに搭載されているNode.jsを利用することでローカルPCにアクセスでき、即ちローカルにあるC#製のDLLに直接アクセスしてメソッドを呼び出すことが可能ということになるでしょうか?具体的にNode.jsから呼び出す際に参考となるWebサイトなどはありますでしょうか?WebAPIを作るのは私の知識では現実的でなく大変そうなのでできたら直接呼べたらと思います。因みにツクールMVの制限はそれほど固くないように思いますが確認しておきます。
BluOxy

2020/12/22 03:29 編集

> Node.jsを利用することでローカルPCにアクセスでき ファイルなどのリソースへのアクセスはできます。(dllファイルへのアクセス自体もできる) しかし、C#のdllの中身を解釈して呼び出すということはNode.js上からできないと思います。 基本的に、C#で作成したdllファイルは別のC#のプログラムで利用することを目的に存在しています。 その目的に沿わないので当然Node.jsではC#のdllを解釈してメソッドを直接呼び出すという機能は提供されていません。 Node.js上から直接dllを読むということは、技術的に実現不可能なものはないという哲学的発想でいけば可能とはいえますが、Web APIを作るより数千倍は厳しい道と思います。(少なくとも自分は分かりません) そこを頑張るくらいであれば、C#やWeb APIを覚えるか、そのdllを参照するのをやめて別の方法を模索し、Javascript/Node.jsのみで実装するかを選んだ方が現実的と思います。
dodox86

2020/12/22 03:33 編集

私の言葉が足りていませんでしたが、Node.jsでDLLのEXPORT関数にアクセスするとは、Nodeの、N-APIを使ったネイティブアドオンを作ることを想定していました。質問はC#を含んでいますが、質問者さんが使う予定のTUSB-PIOのDLLベースのドライバー(?)は、C言語インターフェースを持っていましたので。C#のDLLはネイティブのDLLではなく、.NETアセンブリなので、また少し(大きく)事情が違います。
BluOxy

2020/12/22 03:39

> Node.js上から直接dllを読む 変化球なライブラリが提供されているので回答に追記します。
nyatama

2020/12/22 04:03

お二人ともお世話になっております。 >BluOxyさん >そこを頑張るくらいであれば、C#やWeb APIを覚えるか、そのdllを参照するのをやめて別の方法を模索し、Javascript/Node.jsのみで実装するかを選んだ方が現実的と思います。 Javascript/Node.jsのみで実装というのはTUSB-PIOの仕様を解析するのは困難なのでやはりDLL経由でないと難しそうな気はしてます。 C#のDLLを解釈というのはDLL単体だと解釈できないという意味でしょうか?一応ヘッダファイル(.h)も同梱されてるのでそれを見たら解釈できたりしませんか?DLLの中身を理解しやすくするためにこのファイルがあるんじゃないかなと思ってましたがこの理論は間違ってますか? あとC#がだめならC++のDLLでも結局は同じことでしょうか? とりあえずサンプルプログラムが動作したからあとは簡単と思っていた私が間違っておりましたorz色々知識不足のようです???? >dodox86さん >Node.jsでDLLのEXPORT関数にアクセスするとは、Nodeの、N-APIを使ったネイティブアドオンを作ることを想定していました。 まだNodeは把握してませんのでEXPORT関数やN-API、ネイティブアドオンといった言葉は理解できません。Nodeを勉強しないとお話にならないようで…今の私には敷居が高いですねorz
BluOxy

2020/12/22 04:08 編集

すみません。そもそも、ヘッダファイルと書いていますが、C#にヘッダファイルは存在しません。 恐らくC++のdllをコンパイルする前のヘッダファイルのことではないでしょうか。(C++は専門外なので、頓珍漢なことを言っていたらすみません)
nyatama

2020/12/22 04:08

失礼しました。確かにC#にヘッダファイルは存在してませんでした。 C++のほうだけだったようです。勘違いしておりました????
BluOxy

2020/12/22 04:20

> C#がだめならC++のDLLでも結局は同じことでしょうか Node.js単体では利用できない認識です。(先ほど紹介したEdge.jsやHTTP通信で.NETのプログラムにアクセスできれば可能)
BluOxy

2020/12/22 04:35 編集

> ヘッダファイル(.h)も同梱されてるのでそれを見たら解釈できたりしませんか? ヘッダファイルには型やインタフェースが記載されている以上、何の関数を呼び出せるかはおそらく解釈可能とは思います。しかし、実装は記述されていないので解釈できません。 > DLLの中身を理解しやすくするためにこのファイルがあるんじゃないかなと思ってましたがこの理論は間違ってますか 実装の隠蔽が目的のような気もしますが、詳しくは下記が参考になるかと思います https://teratail.com/questions/10742
退会済みユーザー

退会済みユーザー

2020/12/22 05:45 編集

ヘッダを見て知る事が出来るのは、DLLからどのような関数がエクスポートされ、どのようなデータ型や構造体・クラスが使われているかくらいです。そして、問題はそのDLLからエクスポートされた関数を呼び出せるかどうかという一点です。開発言語の機能として、DLLのエクスポート関数にアクセスする方法が用意されているものは比較的簡単に使えると思うのですが、JavaScriptはそういった機能を持ち合わせてはいません。Node.jsの拡張モジュール等を使えば可能みたいですが、そのあたりは詳しくないのでググって調べるしかないですね。 https://kagasu.hatenablog.com/entry/2019/05/07/143351
nyatama

2020/12/22 08:40

何も知らない無知な私に懇切丁寧に色々教えていただき感謝でいっぱいです????またなにかわからないことがあれば質問させていただきますのでその節はまたお世話になるかもしれません。ご迷惑おかけするかもしれませんがどうかよろしくおねがいします????
guest

回答1

0

ベストアンサー

C#のdllであれば、間接的ではありますがASP.NET Core を使って Web API を作成する方法があります。
WebアプリケーションやRESTの知識が必要です。

  1. ASP.NET Coreのプロジェクトを作る
  2. プロジェクトにdllの参照を追加する
  3. Web APIのコントローラークラスを作成し、GETやPOSTリクエストを受け付けられるようにする(その際に、dllにアクセスして任意の処理を行うよう実装する)
  4. アプリケーションが完成したらWebサーバを立ててクライアント(RPGツクール)側と疎通ができるようにする
  5. Javascript側からAPIにアクセスする(Fetch APIが手軽かもしれません)

別案

Edge.js が .NET と Node.js 間のやり取りを実現してくれるようです。

Qiitaで試している方もいるので下記も多少参考にして試してはいかがでしょうか。
[Node.js] Edge.js を触ってみた

(個人的には普通にWeb APIのサーバを立てる方が好みですが、方法の1つとして存在したので紹介しておきます)

投稿2020/12/21 07:39

編集2020/12/22 03:59
BluOxy

総合スコア2663

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

BluOxy

2020/12/22 04:00 編集

Edge.jsについて仕組みや使い方に関する解説はほとんどできませんが、C#やWin32のメソッドを呼び出すといった実装は可能だそうです。
nyatama

2020/12/22 04:55

WebAPIとEdgeという方法があることについて教えていただきありがとうございます。何をすればよいか全くわからない状態で露頭に迷っていましたが概要が少しずつですがわかってきましたので助かりました。方法としてはこれらを学習していくしかなさそうですね。 これらで不明なことがあれば個別に新しく質問したいと思います。 道のりを教えていただいたBluOxyさんをベストアンサーとさせていただきます。ありがとうございました。 また有用な情報を提供いただきましたradian様もありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問