MagicXpaで自作dllを使用する

# Magic xpaとは
イスラエル生まれのローコード開発ツールです。
プログラミング経験が少なくても簡単に扱えるが、欲しい情報が見つかりづらいのが難点でした。
自分が困ったので同様の疑問を持つ方に向けて記事を投稿した次第です。

# 自作dllを作成する
MagicXpaは外部のdllを連携して利用することが可能です。
まずは連携用の自作dllを作成しましょう。
## プロジェクトの作成
クラスライブラリ(.NET Framework)を選択します。
![VirtualBox_win10_20221003_09_10_2022_19_50_37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1851156/3daa0b3b-6d03-ccb8-4b0a-76924574f399.png)
## フレームワークの選択
今回は.NETFramework4.8を選択します。
![VirtualBox_win10_20221003_09_10_2022_19_51_44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1851156/c95961c3-11c2-7f80-e37b-6b74801a47cf.png)
## COMクラスの実装
今回は簡単な足し算と引き算のメソッドを持つクラスを作成します。
```C#:COMコンポーネントとCOMクラスの実装
using System;
using System.Runtime.InteropServices;

namespace ComLinkagePractice
{
    [Guid("2A6CDF08-1C87-49B6-9058-7AEE529E1594")]
    [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
    public interface ComLinkagePracticeInterface
    {
        int Addition(int num1, int num2);
        int Subtraction(int num1, int num2);
    }

    [Guid("74498E3C-2777-4F9E-A3D1-EC97558EBF44")]
    [ClassInterface(ClassInterfaceType.None)]
    public class ComLinkagePractice : ComLinkagePracticeInterface
    {
        public int Addition(int num1, int num2)
        {
            return num1 + num2;
        }
        public int Subtraction(int num1, int num2)
        {
            return num1 - num2;
        }
    }
}
```
```C#:Assemblyinfo.cs
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。
// 制御されます。アセンブリに関連付けられている情報を変更するには、
// これらの属性値を変更してください。
[assembly: AssemblyTitle("ComLinkagePractice")]
// AssemblyDescriptionがMagicXpaのタイプライブラリで表示されます。
[assembly: AssemblyDescription("ComLinkagePractice")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("ComLinkagePractice")]
[assembly: AssemblyCopyright("Copyright ©  2022")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]

// ComVisible を false に設定すると、このアセンブリ内の型は COM コンポーネントから
// 参照できなくなります。COM からこのアセンブリ内の型にアクセスする必要がある場合は、
// その型の ComVisible 属性を true に設定してください。
[assembly: ComVisible(true)]

// このプロジェクトが COM に公開される場合、次の GUID が typelib の ID になります
[assembly: Guid("1abad2b4-423a-48db-aa2f-6d03ce33f2d1")]

// アセンブリのバージョン情報は、以下の 4 つの値で構成されています:
//
//      メジャー バージョン
//      マイナー バージョン
//      ビルド番号
//      リビジョン
//
// すべての値を指定するか、次を使用してビルド番号とリビジョン番号を既定に設定できます
// 既定値にすることができます:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

```

## 署名を行う
![VirtualBox_win10_20221003_09_10_2022_20_12_33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1851156/f06a58a1-ec91-df9f-a46a-b568987060c9.png)

## プロジェクトのビルド
![VirtualBox_win10_20221003_09_10_2022_17_47_49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1851156/ee045ec1-f168-3191-08ce-70e5c69e14c1.png)

# GAC(Global Assembly Cache)への登録
複数のアプリケーションで共有してdllを利用する場合はGACへ登録する必要があります。
プロジェクトのビルドでdllが作成されましたのでGACへ登録します。
```cmd
//GACにインストールする
gacutil -i 登録するdllのパス

//すべてのパブリッククラスを登録し、タイプライブラリ.tlbを生成および登録する
regasm 登録するdllのパス.dll /tlb: 生成するdllのパス.tlb

//実際のパスを当てはめてみる
gacutil -l C:\Users\admin\Source\Repos\ComLinkagePractice\ComLinkagePractice\obj\Release\ComLinkagePractice.dll
regasm C:\Users\admin\Source\Repos\ComLinkagePractice\ComLinkagePractice\obj\Release\ComLinkagePractice.dll /tlb:C:\Users\admin\Source\Repos\ComLinkagePractice\ComLinkagePractice\obj\Release\ComLinkagePractice.tlb
```

# Magic xpaで自作dllを使用する
モデルリポジトリでdllを定義します。
型はOLEを選択しタイプライブラリでdllを選択します。
![VirtualBox_win10_20221003_09_10_2022_18_08_18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1851156/69473ad5-b18e-22bf-3c68-5ec768f1d5c9.png)

オブジェクト名を設定します。
ここでは使用したいクラスを選択します。
![VirtualBox_win10_20221003_09_10_2022_18_08_41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1851156/62e175a6-6903-baed-4258-b2e6d1b3884f.png)

## dllを実際に使用する
データービューでdllやメソッドに必要な引数、戻り値などの変数を設定します。
![VirtualBox_win10_20221003_09_10_2022_20_49_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1851156/f7337d2d-2db4-0f51-9688-6d25facdb22a.png)
ロジックで外部コールのCOMを選択しデータビューのCOMが設定されている変数を選択します。
![VirtualBox_win10_20221003_09_10_2022_18_22_17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1851156/e449833c-b36e-c4c2-78f2-ed4749c81df5.png)
使用するメソッドを選択します。
![VirtualBox_win10_20221003_09_10_2022_18_22_26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1851156/23d234c2-8eae-3645-2a6f-bafb54808a1b.png)
後はいつもの通りにパラメータと戻り値を設定します。
![VirtualBox_win10_20221003_09_10_2022_18_24_27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1851156/f7658d55-eeea-6a53-5df7-4933ecdcdf49.png)

## フォームを作成する
![VirtualBox_win10_20221003_09_10_2022_21_15_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1851156/01e7d2a3-659c-4812-ced5-d745090712ea.png)

## 完成したものがこちら
Magicxpaで計算処理を書いていないのにちゃんと足し算と引き算が出来ています！
![ComLinkagePractice.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1851156/0fd3747b-c4a1-da51-bedd-1fbb15765313.gif)

# 最後に
今回はあくまで簡単なロジックでしたが、これを活かせばMagicxpaでは苦手な処理もC#に委託することが可能です。
自作dllを利用して快適なMagicライフをお楽しみ下さい。

# 参考文献
- [Integrando Magic xpa e COM / .NET](http://blog.magicsoftware.com.br/integrando-unipaas-e-com-net/)
- [COM(Component Object Model)についてふわっと学習していく その3 COMコンポーネント実装](https://qiita.com/mintcandy/items/1833534ed6e663c16914)
- [方法: アセンブリをグローバル アセンブリ キャッシュにインストールする](https://learn.microsoft.com/ja-jp/dotnet/framework/app-domains/install-assembly-into-gac)
- [Regasm.exe (アセンブリ登録ツール)](https://learn.microsoft.com/ja-jp/dotnet/framework/tools/regasm-exe-assembly-registration-tool)