最終更新日 2024-09-25

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

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

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

概要

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

秀丸マクロから呼び出される以下の関数に [DllExport][MarshalAs(UnmanagedType.LPWStr)] を自身で付け加える形に修正し、確認してください。

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


namespace MyTestCOMClient
{
  public class Program
  {
      [DllExport]
      [return: MarshalAs(UnmanagedType.LPWStr)]
      public static string abc(MarshalAs(UnmanagedType.LPWStr) 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
      {
      }
  }
}