プラグインとしての作り方

投稿者:アーク <info.nds.laboratry あっとまーくgmail.com> 投稿日:2019/06/13(Thu) 14:05:32 No.2445

お世話になります。アークです。

現在、URLを処理するプログラムを作成しています。
URL文字列を与えると特定の結果を返すような手順を作りました。
例えば下記の様なものです。
------------------------------------------------------------
ページは、「https://xxx.ne.jp/schedule/30.html
結果は、ページから読み取ったもの
結果を表示する

【文字列】から、読み取る手順
  データ一覧は、[文字列]を「/」で区切ったもの
  もし(データ一覧(2)が「chart」)なら
    1を返す
  他でもし(データ一覧(2)が「schedule」)なら
    2を返す
  そうでないなら
    0を返す
  もし終わり
終わり
------------------------------------------------------------
実際にはもっと複雑な内容になっています。

汎用的に使うので手順部分をDLLとして実行ファイルにして、
プログラムから呼び出して使いたいと思っています。
プラグインの書き方を読んでみましたが良く分かりませんでした。
具体的にどの様に書いたらよろしいでしょうか。

Re: プラグインとしての作り方

投稿者: 投稿日:2019/06/13(Thu) 16:32:15 No.2446

 こんにちは。

 プロデルのプラグインを作成する場合、C#やVBで作成する方法と、プロデルデザイナから.rdrファイルを開いてファイルの種類に「プラグイン(DLL) (*.dll)」を指定して作成する方法の2通りがあります。
 今回の場合、.rdrファイルからプラグインを生成するものとと推測しました。
 下記の分は上記の想定で記載していますので、もし違うようでしたらご指摘ください。

 まず、.rdrファイルからプラグインを作る場合、種類を作成して、その中に手順を書いていかないといけないようです。
 要するに、プログラムから呼び出す際は、「作る」分でプラグインに実装した種類を作成し、その手順を呼び出すような形になります。
 ということで、実際に作成してみました。
 下記のサンプルで一応は動くと思います。
 なお、勝手ながら、提示いただいていたサンプルソースの手順内のデータ一覧の要素番号が間違っていたため、修正させていただきました。
 データ一覧(2)だと文字列が空白で、常に0が返っていました。

 それでは、まず、プラグイン側のサンプルです。

----------
URLパーサとは
【自分】で【文字列】から読み取る手順
  データ一覧は、[文字列]を「/」で区切ったもの
  もし(データ一覧(4)が「chart」)なら
    1を返す
  他でもし(データ一覧(4)が「schedule」)なら
    2を返す
  そうでないなら
    0を返す
  もし終わり
終わり
終わり
----------

 続いて、呼び出し元のプログラムです。

----------
/*
利用するプラグインファイルを指定する。
なお、実際に動かす際は、ファイル名の部分を生成したプラグインのファイル名に変更すること。
*/
「plugin_test.dll」を利用する

ーー種類を作成する。
パーサというURLパーサを作る
ーー作成した種類内の手順を呼び出して、結果を取得し、表示する。
ページは、「https://xxx.ne.jp/schedule/30.html
結果は、パーサでページから読み取ったもの
結果を表示する
----------

 以上となります。

 参考になれば幸いです。

Re^2: プラグインとしての作り方

投稿者:アーク <info.nds.laboratry あっとまーくgmail.com> 投稿日:2019/06/13(Thu) 22:44:34 No.2447

陸様、こんばんは。アークです。

いつもお世話になります。

〉今回の場合、.rdrファイルからプラグインを生成するものとと推測しました。
はい、そうです。

〉データ一覧(2)だと文字列が空白で、常に0が返っていました
サンプルコードの誤りです。

掲載して頂いた方法で機能する事を確認しました。
作成したプラグインの方に問題が有るものと思っていましたが、
呼び出す側に潜んでいました。
私は助詞の使い方を理解していないようです。
お陰様で先に進む事ができます。ありがとうございました。

〉C#やVBで作成する方法
そちらも宜しければ教えていただけますでしょうか。
また、C#はコマンドラインコンパイラしか使った事が有りませんが、
それでも作成可能でしょうか。

Re^3: プラグインとしての作り方

投稿者: 投稿日:2019/06/14(Fri) 00:02:27 No.2448

 こんばんは。

 お役に立てたようでよかったです。

> 〉C#やVBで作成する方法
> そちらも宜しければ教えていただけますでしょうか。
> また、C#はコマンドラインコンパイラしか使った事が有りませんが、
> それでも作成可能でしょうか。

 はい、Windows付属のコンパイラでも大体のものは作成可能です。
 というか、私もいつもこれでプラグインをいろいろ作っています。

 ということで、作ってみました。

 C#でプラグインを作る場合、呼び出し側で種類をわざわざ作成しなくても呼び出せるのがメリットだと思っています。(もしかしたら、.rdrファイルからプラグインを作る場合でも実装できるのかもしれませんが、よくわかりませんでした。)
 それから、C#でプラグインを作成した場合、作成したDLLのサイズが小さいのもメリットです。

 さて、実際のソースです。
 まずは、プラグインのもととなるC#のソースコードです。
 わかりやすいようにコメントを入れているので、かなり長くなっていますが、やってることはそんなに難しくない、と思います。

----------
/*
下記はおまじないだと思っておいてください。
// 特に、「using Produire」がないと、プロデルのプラグインとして動作させることができないので、プラグインを作る場合は、C#コードの先頭に必ず記述してください。
*/
using System;
using Produire;

// 名前空間の指定
namespace URLパーサ{
/*
クラスを作成
クラス名は、「【自分】で」や「【自分】から」などの「自分」の部分に入りますので、わかりやすい名前を付けるとよいでしょう。
プロデルのプラグインとして利用する場合は、クラス名のあとに「 : IProduireStaticClass」もしくは「 : IProduireClass」の記述が必要です。
「IProduireClass」を指定してクラスを作成した場合は、呼び出し側で「作る」命令で種類を作成する必要があります。
「IProduireStaticClass」を指定した場合は、「作る」命令を利用する必要はありません。
*/
public class URLパーサ : IProduireStaticClass{
/*
この手順を呼び出すときの呼び出し方法を指定
今回は、「URLパーサで」で呼び出したいので、「[自分("で")]」を指定します。
*/
[自分("で")]
/*
実際の手順を記述
手順名(ここでは、「読み取る」)は、わかりやすいものでかまいません。
手順の作成方法は、
public 戻り値の型 手順名(引数){
のような感じで、基本的にはC#の関数の作成と同じです。
ただ、プロデルのプラグインを指定する場合、引数の前に、「[を]」や「[から]」のように助詞を指定することができますが、例外として、「[の]」は指定できないので、注意が必要です(自分も「の」を指定してよくはまるので結構重要だったりします)。
*/
public int 読み取る([から]string ページ){
// 文字列を配列に分割
string[] data = ページ.Split('/');
/*
配列内の文字列で、戻り値を返却
なお、手順作成の際、戻り値に指定した型と違う型で戻り値を返そうとした場合、コンパイラでエラー扱いとなり、コンパイルできないので、注意してください(例えば、戻り値の型を「int」と指定しているのに、「string」を返そうとした際など)
*/
if (data[3] == "chart"){
return 1;
}else if (data[3] == "schedule"){
return 2;
}else{
return 0;
}
}
}
}
----------

 続いてこれをコンパイルする必要がありますが、私はいつも楽なようにバッチファイルを作ってコンパイルさせています。
 いちいちコマンドを打つと長くなってしまうので。
 とりあえず、バッチファイルを張っておきます。
 なお、さっきのプログラムを「urlparse.cs」として保存したうえで、「urlparse.dll」というファイル名で作成するものとします。

----------
@echo off
set cscPath=C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe
if not exist %cscPath% (
echo C#コンパイラが見つかりません。このバッチファイルを開いて、「set cscPath=」のあとのパスをC#コンパイラのパスに書き換えてください。
goto end
)
set input=^
urlparse.cs
set output=urlparse.dll
set type=library
set produirePath="%programfiles(x86)%\produire"
set produireDLL=utopiat.Host.dll
set targetCPU=x86
set runcmd=%cscPath% /optimize /nologo ^
/platform:%targetCPU% ^
/target:%type% ^
/lib:%produirePath% ^
/reference:%produireDLL% ^
/out:%output% ^
%input%
echo running "%runcmd%"
%runcmd% > error.txt
for %%i in (error.txt) do set size=%%~zi
if %size%==0 del error.txt
echo finished
goto end

:end
pause
----------

 上記のバッチファイルを保存して実行すると、めでたく「urlparse.dll」というファイルが出来上がると思います。

 さて、今度はプロデルから呼び出す方法です。
 下記がソースとなります。

----------
「urlparse.dll」を利用する

ページは、「https://xxx.ne.jp/schedule/30.html
結果は、URLパーサでページから読み取ったもの
結果を表示する
----------

 以上、かなり長くなってしまいましたが、参考になれば幸いです。

 それでは。

ありがとうございました

投稿者:アーク <info.nds.laboratry あっとまーくgmail.com> 投稿日:2019/06/14(Fri) 21:39:35 No.2449

陸様、こんばんは。アークです。

詳細な説明ありがとうございます。
とても助かります。
流石にこちらは直ぐには理解できませんが、
挑戦してみたいと思います。

rdrのプラグインの方も実際に作っている物では簡単では無く、
助詞に関係したエラーが山の様に出ています。
先ずはこちらのエラー解消に取り掛かっています。

この度は色々とありがとうございました。

▲ページの先頭へ

- WebForum -