最終更新日 2021-03-21

.NET4.x から .NET5 以降(.NET6, .NET7, ...) の.dllを呼び出す

秀丸エディタ v8.97 以降かどうかで判断が変化します。

秀丸エディタ v8.97 では.NET5の.dllを、COM経由で普通に読むことができます。
そちらも参照してください。

概要

考え方や作り方は、hm.NET用の記事「.NET4.x から .NET5 を 呼び出す」と同じです。

秀丸マクロから呼び出される以下の関数の staticを無くす形 で自身で修正し、確認してください。

また、.NET5側をCOMにするだけではなく、これまで通り秀丸マクロから呼び出す.NET4.x側もCOMになるので、
下記の2点の設定を忘れないようにしてください。

  • MyTestCOMClientプロジェクト→プロパティ→アセンブリ情報→アセンブリをCOM参照可能にするのチェックを入れる
  • MyTestCOMClient.ProgramクラスにGUIDを割り当てる

.NET5をCOMにする方法と、.NET4.xをCOMにする方法が全く違うことも注目点です。

MyTestComClient.cs
using System;
using System.Runtime.InteropServices;


namespace MyTestCOMClient
{
    [Guid("EB6BB021-850D-429B-88BC-587A77E8CC9E")]
    public class Program
    {
        public string abc(string str)
        {
            try
            {
                var server = new MyTestComActivation.IMyTestComInterface();
                string[] list = { "aaa", "bbb", "ccc" };
                var add = server.AddString(str, "かきくけこ", list);
                return add;
            } catch(Exception e)
            {
                System.Diagnostics.Trace.WriteLine(e.Message);
            }
            return "";
        }
    }


    //次のクラスは通常PIAで定義されていますが、この例では
    //シナリオを単純化するためにここで定義されています。
    namespace MyTestComActivation
    {
        // CoClass のマネージドの定義
        [ComImport]
        [CoClass(typeof(MyTestComServer))]
        [Guid(ContractGuids.ServerInterface)] // TlbImp規則により、これを親インターフェイスのGUIDに設定します
        internal interface IMyTestComInterface : IMyTestCOMServer
        {
        }

        // CoClassのマネージドアクティベーション
        [ComImport]
        [Guid(ContractGuids.ServerClass)]
        internal class MyTestComServer
        {
        }
    }
}

秀丸マクロから呼び出し

MyTestComClient.mac
#obj = createobject( currentmacrodirectory + @"\MyTestComClient.dll", "MyTestCOMClient.Program" );

$bbb = member(#obj, "abc", "あいうえお");
message($bbb);

releaseobject(#obj);