プロフィール

髭山髭人(ひげひと)

自分の書いた記事が、一人でも誰かの役に立てば...
活動信条の一つとして「貴方のメモは、誰かのヒント」というのがあります。

このサイトについて

本家HP packetroom.net から切り離した いわゆる技術メモ用のブログで、無料レンタルサーバーにて運用しています。広告表示はその義務なのでご容赦。
XREA さんには長年お世話になっています

C# VisualStudioCommunityでマルチコメントビューアのプラグインを作ってみる

はじめに

Ryu (@kv510k) 氏 作成の MultiCommentViewer 用プラグインを作成したかったので、
GitHubやらなんやら覗いたりして自分の知見を基に書いた記事です。

ryu-s.github.io > マルチコメントビューア
GitHub > MultiCommentViewer

注意事項と言い訳と免責

この先、本体の仕様変更なども十分にあり得ますし、ここに記してある方法がいつか突然使えなく(通じなく)なる可能性もあるので、そこんとこご留意オナシャスです。

MultiCommentViewer 表記だと長いので、以下大抵のケースで MCV の略記を用います。

また、本記事はMCVプラグインの必要最低限レベルな作り方を紹介する所に趣旨を置いているので、
本記事で作成するプラグインは「何もしないプラグイン」です。 ウィンドウなども表示しません。

環境

  • Visual Studio Community 2019
  • C#
  • .NET Framework (執筆時 : 4.6.2~必須)
  • MultiCommentViewer (執筆時 : v0.5.19~.20)

プロジェクト作成

C# クラスライブラリ (.NET Framework) を選ぶ。
プロジェクトの対象フレームワークは少なくとも 4.6.2 にすること

( .NET Standard の方は良く分からないので自分はノータッチです )

例として、今回は MCV_TestPlugin というソリューション,プロジェクト名で作成していきます。

「MCV_TestPlugin というソリューション」の配下にある「MCV_TestPlugin というプロジェクト」といった構成が出来上がります

プラグインとして書き出すファイル名(アセンブリ)の命名規則

MCV本体の仕様として、ファイル名が「~~Plugin.dll」で終わる形式の物のみをプラグインとして認識している様です。
この命名規則を守らないと、対象の.dllをプラグインをして扱ってくれませんでした。

必要に応じて、プロジェクトのプロパティ→アプリケーションからアセンブリ名の項目を弄っておきましょう

必要なパッケージを NuGet で導入

ソリューションエクスプローラから MCV_TestPlugin プロジェクト上で右クリックし、
「NuGet パッケージの管理」を選択します。

( または、ソリューションエクスプローラ上で「MCV_TestPlugin」プロジェクトをクリックして選択した状態から、
メニューのプロジェクト→「NuGet パッケージの管理」でも同じ機能にアクセスできます )

「参照」のメニューから、数々の公開されているパッケージをオンラインで検索します。 MCVのプラグインを作成するにあたり「System.ComponentModel.Composition」というものが必要になってきますので、 それを検索し、自前のプロジェクトにインストールさせておきます。

これやっておかないと、DLLの内部情報を外部に向けて使わせる御膳立てが出来ず、 マルチコメビュ本体のプラグインリストに上がらなくなります。

( ※ [Export(typeof(IPlugin))] を使う為 )

アセンブリ参照

ソリューションエクスプローラから「MCV_TestPlugin」プロジェクト配下の「参照」上で右クリックし、 「参照の追加」を選択します。

( または、ソリューションエクスプローラ上で「MCV_TestPlugin」プロジェクトをクリックして選択した状態から、 メニューのプロジェクト→「参照の追加」でも同じ機能にアクセスできます )

MCVのプラグインを作るので、MCVの内部機能を間借りする必要があります。 ここでやっている事は「MCV独自の処理・機能を使わせてもらう為に、間借り先を指定する」...みたいなイメージを持ってもらえれば。

「参照マネージャー」というものが出てくるので、左にある「参照」項目を選択し、 そのまま右下の「参照」ボタンから、以下の.dllを指定します。

  • MultiCommentViewer\dll\SitePlugin.dll
  • MultiCommentViewer\dll\Plugin.dll

いずれも、マルチコメビュ本体の中に含まれているファイルです。

「ほぼ何もしない」プラグインを作成するにしても、恐らくこの2つは必須レベル。
他は都度、使いたいMCVの機能に応じて参照を増やしていく感じになるかなーと思います

ひな形レベルのコード

雑ですが「中身が空だけどコードとしてはほぼ必須レベル」のテンプレに近いコードを、 説明詳細を省いて記しておきます。 ひな形というにはちょっと物足りなさ過ぎる気もしますが...

Class1.cs の中身をまるっと以下に置き換える感じで。

using System;
using System.IO;
using Plugin;
using SitePlugin;
using System.ComponentModel.Composition;

namespace MCV_TestPlugin
{
    [Export(typeof(IPlugin))]
    public class TestPlugin : IPlugin, IDisposable
    {

        public string Name {get{ return "プラグイン名"; } }
        public string Description { get { return "プラグイン説明"; } }
        public IPluginHost Host { get; set; }

        public virtual void OnLoaded()
        {

        }

        public void OnClosing()
        {

        }

        public void OnMessageReceived(ISiteMessage message, IMessageMetadata messageMetadata)
        {

        }

        public void OnTopmostChanged(bool isTopmost)
        {

        }

        public void ShowSettingView()
        {

        }

        public void Dispose()
        {
            Dispose(true);
        }

        protected virtual void Dispose(bool disposing)
        {

        }

    }

}

とりあえずメイン部分のクラスは、MCVの Plugin.IPlugin インターフェースを継承してこさえる事が前提

今のところ(MCV 0.5.19~.20)強制的に実装しなければいけないフィールド及びメソッドは以下の通り

  • .Name
  • .Description
  • .Host
  • .OnClosing()
  • .OnLoaded()
  • .OnMessageReceived(SitePlugin.ISiteMessage, SitePlugin.IMessageMetadata)
  • .OnTopmostChanged(bool)
  • .ShowSettingView()

更に IDisposable の継承により、以下メソッドも必須となっています

  • .Dispose()

ビルドして配置

多少順不同でも構いませんが、この記事の手順通りに行えば、 少なくとも執筆時のバージョンであればエラー吐くことなくビルドが通ると思います。

書き出された MCV_TestPlugin.dll がプラグイン本体となります。 プロジェクトのアセンブリ名を弄っていれば、名前はそちらの物になっている筈です。

( しばらく前の項目でも触れましたが「~Plugin.dll」のファイル名で終わる形式は順守してくださいね )

MCVに配置

MultiCommentViewer\plugins\ に各種プラグインがフォルダ単位で配置されています。
他プラグインと同様、なにがしかのフォルダを作成し、そこにビルドして書き出した MCV_TestPlugin.dll を放り込めばOK。

今回、プラグインのフォルダ名はTestPlugin としました

※ ビルド時に他のファイルも書き出されますが、ことMCVのプラグインとして使う分には その他の.dll等を一緒にプラグインフォルダに放り込まなくても起動する 事を、自環境では確認しています。

プラグインとして認識されている事を確認

MCV本体を起動し、メニューの「プラグイン」項目の中に 「プラグイン名」(←まんますぎる名前) が挙がっている事を確認してフィニッシュです

その他の事

ここでは触れませんが「受信したコメントに応じてなにがしかの処理をさせたい」という場合なら、.OnMessageReceived() メソッド内部に色々書いて処理を振り分けると良いです。

興が乗ればこの記事に加筆などするか、もうちょっと凝った処理用に新しく記事をこさえるかもしれません。

今日日、多数のライブストリーミングサービスが賑わっている中、こういった複数プラットフォーム横断配信を実現してくれるツールはマジで神がかっているといっても過言ではないでしょう。
元々興味本位で「マルチコメビュのプラグイン作成方法を解説している初心者向け記事無いかな~」と調べたのですが上手い事ヒットせず、ガッカリしたのでじゃあ自分で調べるか...と思い立ってこさえた記事となります。
有志の個人開発者に完全に依存する形にはなりますが、マルチコメビュの更新対応と動作が続く限り、この記事もまた配信を賑やかす助けの一つとなれれば本望です。

やや個人的なメモ

PluginCommon.Tools.GetData() を使う場合

アセンブリ参照で MultiCommentViewer\dll\PluginCommon.dll を追加させて使う事になる筈。 しかし、自環境だと以下のようなエラーが起きた。

>型 'ValueTuple<,>' は、参照されていないアセンブリに定義されています。
>アセンブリ 'System.ValueTuple, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51' に参照を追加する必要があります

NuGet で「System.ValueTuple」を導入して解決 (執筆時パッケージ v4.5.0)

接続周りの情報を得る (v0.5.20)

現状、自分の探った限りでは 使えるか使えないか微妙なラインでしか取得できなかった (+_+

System.Collections.IEnumerator eNumr = this.Host.GetAllConnectionStatus().GetEnumerator();
while (eNumr.MoveNext())
{
    var _item = (MultiCommentViewer.ConnectionViewModel)eNumr.Current;
    // 接続先として入力されている文字列
    Console.WriteLine("ConnectionViewModel.Name : " + _item.Name);
    Console.WriteLine("├Input : " + _item.Input);
    Console.WriteLine("└InputWithNoAutoSiteSelect : " + _item.InputWithNoAutoSiteSelect");
}

フォームを構築した時に、スタイルが古いものになる

内部で form 作ってウィンドウを表示するときに、なぜかスタイルがフラットにならなかった。 いろいろ悩んでたんだけど、OnLoaded() の最初の方で Application.EnableVisualStyles(); を呼んだら解決した。 ちなみに ShowSettingView() の中で呼んだ場合は効果が無かった

public virtual void OnLoaded()
{
    // フラットスタイルにするために、このタイミングで呼ぶ
    Application.EnableVisualStyles();
}