PowerBuilder アプリケーションから .NET Assembly を呼び出す

.NETアセンブリ

こんにちは、サポート部の明石です。

先月 10 月 28 日 ~ 30 日は幕張メッセにてソフトウェア&アプリ開発展が行われ、弊社も PowerBuilder や InfoMaker を中心とした Appeon 社製品を出展しました。予想以上に多くの方が当社ブースへご来場いただけたと感じております、ありがとうございました。

ご来場者様の反応を見ていると、もちろん「Appeon 社製品を今も利用している」とお話いただけたユーザー様もいらっしゃいましたが「えっ、PowerBuilder ってもしかして “あの” PowerBuilder ?」や「PowerBuilder ってまだあったの !?」と驚かれる反応が多い印象でした。過去に PowerBuilder をご利用いただいていたご来場者様との会話やデモを通じて私も嬉しい気持ちになり、改めて現在も進化し続けている PowerBuilder をどんどんアピールする必要があると感じた 3 日間になりました。

そこで今回はちょっと先走りとなりますが、PowerBuilder 2019 R2 英語版で追加された新機能「.NET Assembly の呼び出し」について一部ご紹介したいと思います。


.NET Assembly 呼び出し機能の概要

PowerBuilder 2019 では UI テーマや RibbonBar コントロールを利用した PowerBuilder アプリケーションの UI モダナイゼーション、また C# による Web API 開発向けの SnapDevelop IDE の追加など興味深い多くの新機能が追加されています。

PowerBuilder ユーザー様とお話をすると、注目度が高い新機能はやはり「UI テーマ」と回答される機会が多い気がします。アプリケーションの見た目、重要ですもんね。しかし、PowerBuilder アプリケーション開発の幅が広がる可能性を秘めているという意味で、今回ご紹介する「.NET Assembly の呼び出し」機能も是非注目していただきたい新機能の一つと考えています。この機能を使用することで PowerBuilder アプリケーションから .NET Assembly を直接呼び出すことができるようになるからです。

この機能を実現するため PowerBuilder 2019 R2 には DotNetAssemblyDotNetObject と呼ばれる 2 つの新しいオブジェクトが追加されます。各オブジェクトの概要については以下となります。

  • DotNetAssembly
    • .NET Assembly をロードし、.NET オブジェクトのインスタンスを作成
  • DotNetObject
    • .NET オブジェクトに関連付けられており、.NET オブジェクトの関数 / プロパティを直接呼び出す

PowerBuilder アプリケーションは、この 2 つのオブジェクトを介して .NET Assembly を直接呼び出すことができます。なお、これらオブジェクトは .NET Web サービスや .NET アセンブリのコンポーネントでは参照できないので注意してください。

DotNetAssembly インスタンスと DotNetObject インスタンスを作成後、.NET Class で定義された関数を直接呼び出すことができるようになりますが、PowerBuilder ではより簡単に開発が行えるように「.NET DLL Importer」というツールも用意されており、DLL を読み込んで各 .NET Class の Nonvisual Object (以下、NVO) を作成し、呼び出しに必要な各種設定を NVO にインポートできるようになっています。

これらの機能を利用して効率的に PowerBuilder アプリケーションからの「.NET Assembly の呼び出し」を実現させることができます。


.NET Assembly の作成

それでは物は試し、.NET Assembly を作成し PowerBuilder アプリケーションから呼び出してみましょう。

さきほども少し触れましたが、PowerBuilder 2019 には C# 開発向けの SnapDevelop という IDE がバンドルされるようになりました。この IDE を利用することで一部 C# の開発が行えるようになっています。折角なのでこの IDE を使用して簡単な .NET Assembly を作成してみたいと思います。

まずは SnapDevelop IDE を起動します。

[File] – [New] – [Project] を選択すると [New Project] ウィンドウが表示されるので、今回は [Class Library(.NET Core)] を選択します。Name (プロジェクト名) や、Location (保存先)、Solution Name (ソリューション名) については任意の値を設定し、[OK] ボタンをクリックすると Class が作成されます。

プロジェクト作成画面

[New Project] ウィンドウ。ダークモード、カッコいい !

次にサンプルプログラムを作成してみましょう。今回は、下記のような四則演算を行う簡単なプログラムを記述します (加算しか使用しませんが…)。

[Class1.cs] ファイル内

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace Class_plus
{
    public class Class_plus
    {
        
            public long plusfun(int entry_a, int entry_b)
            {
                return entry_a + entry_b;
            }
    }
}

namespace Class_minus
{
    public class Class_minus
    {

        public long minusfun(int entry_a, int entry_b)
        {
            return entry_a - entry_b;
        }
    }
}

namespace Class_multiplied
{
    public class Class_multiplied
    {

        public long multipliedFun(int entry_a, int entry_b)
        {
            return entry_a * entry_b;
        }
    }
}

namespace Class_divided
{
    public class Class_divided
    {

        public long dividedFun(int entry_a, int entry_b)
        {
            return entry_a / entry_b;
        }
    }
}

プログラムの記述が完了したら保存してビルドします。ビルドは、プロジェクトを選択し右クリックから [Build] を選択します。

ビルド時

作成されたアセンブリは DLL として [Location (保存先)\Solution Name (ソリューション名)\Name (プロジェクト名)\bin\Debug\netcoreapp2.1] の下に作成されます。


.NET DLL Importer を使用して NVO にインポート

次に、.NET DLL Importer を使って先ほど作成した DLL から NVO を作成してみましょう。

PowerBuilder IDE を起動します。

メニューから [Tools | .NET DLL Importer] を選択すると、.NET DLL Importer ウィンドウが表示されます。各種詳細な設定については、 .NET assembly のインポート (英語でごめんなさいっ) を確認してください。

ここではまず [Source .NET DLL] に先ほど作成した DLL を設定します (先ほど作成した DLL は、.NET Core 用の Class Library となるため、[Framework Type] を [.NET Core] へ設定をお忘れなく)。すると DLL ファイルがロードされ [Select and Preview] に DLL ファイルとファイルに含まれているすべての Class / 関数 / プロパティが表示されるため、インポートしたい Class と関数を選択します。

Class と関数を選択すると、対応する PowerBuilder オブジェクトと関数が [Preview Result] に表示されます。なお、インポートできない機能がある場合は [View Failed Item] に表示されます。

インポートに関する詳細な設定は、[Advanced Settings] で指定することができます。今回 [Encapsulate a DotNetAssembly object in each DotNetObject object] (DotNetObject オブジェクトに DotNetAssembly オブジェクトをカプセル化する) をチェックしておきます。

.NET DLL Importer

.NET DLL Importer の画面

そして [Import] ボタンをクリックすると…おお、NVO が追加された !

.NET DLL Importer

ちなみに「スクリプトを記述してアセンブリをロードし、DotNetObject オブジェクトを作成してから DotNetObject オブジェクトを介して .NET Class 関数を呼び出すことはできますが、関数 / パラメーター / 戻り値が正しく呼び出されることを確認することは困難なため、最初に.NET DLL Importer ツールを使用して .NET Class を PowerBuilderにインポートしてから、インポートしたオブジェクトと関数を直接呼び出して、対応する .NET コードを実行することをお勧めします。」とマニュアルに記載もありますし、このツールを使用した方が開発効率は上がりそうですね。

最後に PowerBuilder でウィンドウを作成し、入力用のシングルラインエディット 2 つ (sle_1 , sle_2 など) とコマンドボタンを用意して、例えば “Class_plus” を呼び出す処理を追加してみましょう。

[cb_add の clicked]イベント

integer li_entry_1, li_entry_2 
long ll_rtn
nvo_class_plus n_dotnet

n_dotnet = Create nvo_class_plus

li_entry_1 = integer(sle_1.text)
li_entry_2 = integer(sle_2.text)

ll_rtn = n_dotnet.of_plusfun(li_entry_1,li_entry_2)
messagebox("結果",string(ll_rtn))

アプリケーションを実行し、ボタンをクリックすると加算処理が走るのが確認できるかと思います。


最後に

今回は PowerBuilder 2019 R2 で追加された新機能である「.NET Assembly の呼び出し」についてその概略と簡単な流れを説明しました。

本記事の情報は 2020 年 11 月現在の PowerBuilder 最新版である PowerBuilder 2019 R2 英語版を利用した内容となっており、今後リリース予定の PowerBuilder 2019 R3 日本語版では仕様が変更される可能性も考えられますし、インポートできないケースもあるようなのでまだまだ機能的に不明な点もありますが、C# 技術者がいれば一部機能を SnapDevelop を活用して開発して PowerBuilder で呼び出す。なんて夢のようなことも実現できるかもしれません。

また何か続報がありましたら、ブログなどでも紹介させていただきます。

以上、明石でした。

テクニカルブログ 一覧を見る
PowerBuilder マイグレーション