[OutSystems] Visual Studioを使わずになんとかExtensionを作成してみる

Visual Studioを買えない、もしくは手に入るまで時間がかかる場合のその場しのぎを検討する。
2020/12/3時点で公式にサポートされているのは、Visual Studio の2015/2017/2019だけなので、本当にその場しのぎです。

# 確認環境
Personal Environment(Version 11.10.0 (Build 22910))
Integration Studio(Version 11.6.21)
サクラエディタ

# システム要件を確認する
システム要件の[必要なソフトウェア](https://success.outsystems.com/ja-jp/Documentation/11/Setting_Up_OutSystems/OutSystems_system_requirements#.E5.BF.85.E8.A6.81.E3.81.AA.E3.82.BD.E3.83.95.E3.83.88.E3.82.A6.E3.82.A7.E3.82.A2)によると、

> Integration Studioを使用して外部システムと連携し、エクステンションアクションのソースコードを編集する場合:
Visual Studio 2015、Visual Studio 2017、またはVisual Studio 2019（Development Environment 11.6.7以降）

ということです。Visual Studio Codeは含まれていません。

# 事前準備
Integration StudioでEditメニュー　＞　Options　＞　.NETタブの.NET Compiler Toolを設定していないとコンパイルができないようです。
もし、未設定であれば、たぶん.NETのコンパイラがないということなので、インストールが必要です。

MSBuildの対象バージョンをインストールして下さい。
Visual Studioが入っている環境の設定値が
```
C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe
```
だったので、たしか2012か2013向けのビルドツールをインストールしたと思います。
（Visual Studioを入れていない環境で試したときの手順を残しそこねたので明確でないです。後で思い出すか環境が手に入ったら確認し直してみます）

# Extensionを開く
まずは、コードを入れるExtehsionを用意して開きます。
Integration Studioから始めることもできますが、配置先を見失わないように、Service Studioで作ってIntegration Studioで開くことにします。

1. Service Studioでアプリケーションを開く
2. ADD MODULEボタンをクリック
3. Module NameにSampleExtensionと入力、Choose module typeでExtensionを選択してCREATE MODULEボタンをクリック
4. Integration Studioが起動するので、PEにそのままログイン

# Extensionを実装する
## Actionの定義
Integer型の値を2つ受け取り、掛け算した結果を返すActionをSampleExtensionActionとして作ります。

Integration 左ペインでActionsを右クリックして、Add Actionを選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/968b8a35-b5ba-fbaf-b236-f2afc131cf41.png)

作成されるActionにSampleExtensionActionという名前をつけます。
入力変数を2つ、出力変数を1つ全てInteger型で定義。2番めの列が右向きだと入力、左向きは出力を表します。クリックすると切り替わる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/a64325b6-7edf-79c9-4bd6-0e1f55e5adcd.png)

## コードを作成
まず、Integration Studioで行ったActionの定義をコードに反映します。
画面上部のツールチップから、以下の部分（右から2番目）をクリックして下さい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/81bc2790-dac6-6ac2-82e4-0603b4e674db.png)

これで、表示中のExtensionのソースコードが更新されました。
再び画面左のペインから、今度はResourcesタブを選択。こっちのタブには、Extensionに含まれるファイルがツリー表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/d5282e4e-5980-1cb4-2e90-51c4b8cb4a00.png)

要はここに表示されるファイルを編集すれば良いようです。
.csファイルにエディタが紐付いている環境であれば、SampleExtension.cs(Extension名.csという形式のファイル名）を右クリックしてOpenを選択。
そうでない場合は、Sourceフォルダで同様に操作。
Explorerが開くので、SampleExtension.csをエディタで開いて編集しましょう。私はサクラエディタを使いました。

以下のようなスケルトンコードが開くので、MssSampleExtensioActionを通常のC#コードとして編集します。

``` cs
using System;
using System.Collections;
using System.Data;
using OutSystems.HubEdition.RuntimePlatform;
using OutSystems.RuntimePublic.Db;

namespace OutSystems.NssSampleExtension {

	public class CssSampleExtension: IssSampleExtension {

		/// <summary>
		/// 
		/// </summary>
		/// <param name="ssInteger1"></param>
		/// <param name="ssInteger2"></param>
		/// <param name="ssResult"></param>
		public void MssSampleExtensionAction(int ssInteger1, int ssInteger2, out int ssResult) {
			ssResult = 0;
			// TODO: Write implementation for action
		} // MssSampleExtensionAction


	} // CssSampleExtension

} // OutSystems.NssSampleExtension
```

編集後（メソッド本体のみ）

``` cs
		public void MssSampleExtensionAction(int ssInteger1, int ssInteger2, out int ssResult) {
			ssResult = ssInteger1 * ssInteger2;
		} // MssSampleExtensionAction
```

## 反映
作業中にコンパイラを走らせて確認するには左のアイコン、Publishには右のアイコンをクリックです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/cb93a86e-43a9-9ffb-87c5-697fb0d499d7.png)

## Integration StudioかPEのバージョン依存の注意
コンパイル時に以下のようなエラーが表示されました。
> C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets(1605,5): warning MSB3268: プライマリ参照 "OutSystems.HubEdition.RuntimePlatform" は、現在ターゲットされているフレームワークで解決できなかったフレームワーク アセンブリ "System.ValueTuple, Version=4.0.2.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51" に間接的に依存するため、解決できませんでした。".NETFramework,Version=v4.6.1"。この問題を解決するには、参照 "OutSystems.HubEdition.RuntimePlatform" を削除するか、"System.ValueTuple, Version=4.0.2.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51" を含むフレームワーク バージョンにアプリケーションを再ターゲットしてください。 

はっきりとしたことは不明ですが、どうもターゲットバージョンの違いのようです。
プロジェクトファイル（.csproj）をエディタで開いて、<TargetFrameworkVersion>を4.6.1から4.7.2に変えることで出なくなりました。

以前作っておいたExtensionでも同じ問題が発生したので、エディタで編集したことが原因ではないと思います。
IDEのアップデートか、最近PEを更新したのでその不整合と思われます。