Consoleアプリなどのexeの中のメソッドを呼ぶ

もくじ

目次(WPF/xaml/C#/C++関連メモ) - tera1707’s blog

やりたいこと

コンソールアプリの中にあるメソッドを、exeを実行して動かすのではなく、直接メソッドを外から呼んで動かしたい。

やりかた

Activator.CreateInstance()を使う。

サンプル

まず、こんな感じでソリューション、プロジェクトを作成する。

  • SubConsoleApp.exeの中にあるメソッドを、
  • MainConsoleApp.exeが呼びたい。
  • ※ClassLibrary1.dllは、dllのメソッドを呼ぶときとの動作比較用。

f:id:tera1707:20220127235914p:plain

呼び出す側のコード。

using System.Reflection;

//------------------------------------------
// DLL内のメソッドを呼ぶ(動的に)
//------------------------------------------
// パスを指定して、dllを呼び出す
var asm = Assembly.LoadFrom(@".\ClassLibrary1.dll");
// 名前空間、クラス名を指定して、上のdllの中のクラスを呼び出す
var cls = asm.CreateInstance("ClassLibrary1.MyClass1") as ClassLibrary1.MyClass1;
// 実行
Console.WriteLine(cls?.MyMethod());

//------------------------------------------
// exe内のメソッドを呼ぶ(動的に)
//------------------------------------------
// exeを呼び出す
var asm2 = Assembly.LoadFrom(@".\SubConsoleApp.dll");
// exe内のクラスを呼び出す
var type = asm2?.GetType("SubConsoleApp.MyClass1");
var obj = Activator.CreateInstance(type) as SubConsoleApp.MyClass1;
// 実行
Console.WriteLine(obj?.MyMethod());

呼ばれる、exeの中のメソッド。

namespace SubConsoleApp
{
    public class MyClass1
    {
        public int MyMethod()
        {
            return 99;
        }
    }
}

※SubConsoleAppのメイン関数はなにもしてないので割愛。 ※ClassLibrary1のコードは、以前やったC#のdllの作り方のところと変わりないので割愛。

qiita.com

参考

今回参考にしたページ。(vbだったが、C#でもほとんどそのまま使えた。)

vbnettips.blog.shinobi.jp