2015年01月

C# プラグイン DLL の呼出でキャストができずハマった

C# でプラグインとやり取りしたいと思ってテストコードを作っていたのだが、思わぬ所で躓いた。

やりたいことはごく普通で、
  • プラグインのインターフェースを定義
  • インターフェースを実装したプラグイン DLL を作成
  • ホスト(EXE)側から、プラグイン DLL を動的に呼びだし
というもの。

プラグインのインターフェースは以下のようなシンプルなもの(PluginInterface.cs)。
namespace TestPlugin
{
    public interface ITestPlugin
    {
        Int32 Diff(Int32 oNum1, Int32 oNum2);
    }
}

このインターフェースを実装した TestDLL.dll を作成しておき、ホスト(EXE)側で以下のコードで呼びだした。
private void button12_Click(object sender, EventArgs e)
{
    ITestPlugin aPI = null;
    try
    {
        Assembly aAsm = Assembly.LoadFrom(@"C:\TestDLL.dll");
        foreach (Type aType in aAsm.GetTypes())
        {
            if (aType.IsInterface)
            {
                continue;
            }

            Object aObj = Activator.CreateInstance(aType);
            aPI = aObj as ITestPlugin;
            if (aPI != null)
            {
                MessageBox.Show("プラグインの計算結果:" + aPI.Diff(5, 3).ToString());
                break;
            }
        }
    }
    catch (Exception oExcep)
    {
        MessageBox.Show(oExcep.Message);
    }
    if (aPI == null)
    {
        MessageBox.Show("プラグインをロードできませんでした。");
    }
}

実行してみると、Activator.CreateInstance() でオブジェクトが生成され、aObj に値が入っているのが(デバッガで)確認できた。また、別途コードを追加して aType.GetInterfaces() でインターフェース名を取得すると、ITestPlugin を有していることも確認できた。

しかし!

次の行のキャストは失敗し、aPI は null のままであった。

いろいろ悩んだが、結果的には、「プラグインインターフェースを定義している PluginInterface.cs を、DLL とホストの双方で直接プロジェクトに追加していた」のが原因だった。

解決策としては、
  1. PluginInterface.cs を直接追加したプロジェクトで予め Interface.dll を作っておき、プラグイン DLL とホストの双方から、参照設定で Interface.dll を参照する。
  2. ホスト側のプロジェクトに PluginInterface.cs を直接追加してビルドし、プラグイン DLL ではホストのバイナリを参照設定で参照する。
のいずれかを行えば良い。解決策 1 だとバイナリファイルが 3 つになるので、ファイルの数で言えば、解決策 2 の方がすっきりする。

しかし、双方で直接プロジェクトに追加するとなぜうまく動かないのかは不明。GUID の問題なのかと思って ITestPlugin に Guid 属性を付けてみたりもしたが、改善しなかった。


唄詠のこれまでと 2015 年以降の予定

唄詠アイコンワンタッチで UTAU 音源による読み上げを行えるツール「唄詠(うたよみ)」。いわゆる自動 HANASU ツール。

同様のことを行うのにはいくつかやり方があるが、その中で唄詠の特徴はと言うと、細かいところを除けばおよそ以下のようなところだと思う。
  • 漢字かな交じり文を書いて再生ボタンを押すだけ、というシンプルな操作で読み上げが可能。
  • 調声作業が一切不要なので手間がかからない。
  • UTAU 音源そのものを使用して発音するので、声のイメージが UTAU に近い。
  • ほぼリアルタイムでの読み上げが可能。
棒読みちゃん唄詠のプログラム的な立ち位置は、テキストスピーチソフト(棒読みちゃんなど)の声として UTAU 音源を割り当てる、というところになる。UTAU エディタに音符を置いていくという従来の UTAU のやり方ではなく、棒読みちゃんや Softalk といった「読み上げソフト」からのアプローチだ。

このことから、ゆっくり関連のツールを UTAU 音源で活用できるようになり、例えば以下のような事が可能になる。
  • ニコニコ動画や生放送のコメントを UTAU 音源で読み上げる。
  • ゆっくり MovieMaker でゆっくり実況ならぬ UTAU 音源実況動画を作成する。

唄詠を初めて公開したのは、ちょうど 1 年前の 2014 年 1 月。今までの歴史を簡単に振り返ってみると、

  • Ver 1.0:1/1 に完成。読み上げソフトからのアプローチという仕組みの基礎を確立。
  • Ver 1.8:多少のアクセントの概念などを導入し初公開。原音 WAVE をそのまま使っていたので発音は稚拙。
  • Ver 3.0:UTAU 音源の原音設定を活用するようになり、発音がまともになった。単独音のみ対応で、読み上げ可能なのは基本的にひらがな・カタカナのみ。
  • Ver 3.2:漢字かな交じり文の読み上げが可能になった。
  • Ver 4.0:連続音音源に対応。
  • Ver 4.4:resampler フラグ、音域、速度など、話し方に変化を付けられるようになった。
  • Ver 5.2:リアルタイム読み上げが可能になった。
  • Ver 5.8:自動バージョンアップ機能を搭載。
  • Ver 6.0:調声プラグイン機構を導入。
という感じだ。

今後予定している、唄詠の大きな改良点は、以下のようなもの。

まずはセキュリティーアップデート。

以前からアナウンスしているように、唄詠の開発に用いているツール(C++Builder XE3 Starter)には画像関連の脆弱性があり、唄詠もこの影響を受ける。C++Builder の一部のバージョンでは脆弱性への対応が行われたが、XE3 Starter について脆弱性が放置されているので、すぐに唄詠の改善を行うことができない。とはいえ、春くらいまでにはなんとか改善したいと考えている。

続いて、発音改善第 1 弾。

現在の唄詠は、ものすごくロボロボしく発音するので、多少は丸く柔らかく発音できるようにしたいと考えている。ただし、第 1 弾の改善は応急的なもので、あまり時間をかけずに夏くらいまでにやりたい。

最後が、発音改善第 2 弾。

皆様のご協力を頂きながら、より人間っぽい発音を研究していきたい。これにはかなりの時間がかかることが想定される。なかなか実現は難しいと思うが、2015 年内に何かしらの成果が出せれば良いなと思う。

今年も唄詠をよろしくお願いします。


ちょちょいと自動更新 Ver 3.01 を公開

「ちょちょいと自動更新」は、アプリの自動更新機能を実現するための開発者向けツールです。もともと唄詠などの SHINTA ソフトウェアに同梱されているツールですが、他のアプリでも使えるために、単体でも公開しています。ただし、機能は少ないです。

今回、ちょちょいと自動更新の Ver 3.01 を公開しました。

本バージョンより SSL に対応しました。取得する RSS や更新版アーカイブのダウンロード先として、https の URL を使うことができます。

また、これまで開発環境として使用していた C++Builder をやめて、新たに Visual Studio C# にて開発し直しました。

ちょちょいと自動更新のダウンロードは、以下からどうぞ。

なお、ちょちょいと自動更新の実行には、.NET Framework 4.5 が必要です。

プログレスバー素材メーカー Ver 3.05 を公開

プログレスバー素材メーカー_Ver305動画やイラストなどの素材としてプログレスバーを用いるのが楽になるツール「プログレスバー素材メーカー」をバージョンアップし、Ver 3.05 を公開しました。

今回は微修正で、設定などの保存場所が変更になっています(ユーザープロファイルを考慮した保存)。この影響で、設定が初期設定に戻りますので予めご了承下さい。

また、同梱の自動更新ツールを刷新したことにより、ファイルサイズがコンパクトになっています。

プログレスバー素材メーカーのダウンロードは、以下からどうぞ。
既にプログレスバー素材メーカーをご利用の方は、3 日以内に自動的にバージョンアップされます。

なお、プログレスバー素材メーカーの実行には、.NET Framework 4.5 が必要です。
月別アーカイブ
記事検索
最新コメント
  • ライブドアブログ