50734
お世話になります。

大変情けない話で申し訳ないのですが、C#にて自作のDLLを作成し、VBA側で使用するまでは  
たどり着いたのですが、C#側でStaticで宣言したクラスをDLLで呼び出す文法が解りません。

```

       public class Class1
        {
            public Class1()
            {
    
            }
    
            public string getMsg()
            {
                return "Hello World.";
            }
        }
    
```

↓↓↓↓↓↓↓↓

```

    Public Sub test()
        Dim a As Sample.Class1
        Set a = New Sample.Class1
        MsgBox a.getMsg
    End Sub
    
```

これは解りました。

```

    public static class Class1
    {
    
        public static string getMsg()
        {
            return "Hello World.";
        }
    }
    
```

↓↓↓↓↓↓↓↓

これが解りません。

MsgBox Sample.Class1.getMsgとしてみましたが、ダメでした。

初歩的な質問で申し訳ありませんが、何卒よろしく  
お願いいたします。
CC BY-SA 4.0
2018-11-28T06:27:43.000
50709
2018-11-29T04:52:00.560
9374
question
c# vba dll
C# 自作DLLをStaticで作成した場合のVBAで使用する方法
クラスとメソッドの両方をstaticにすることは出来ないようです。  
[Can I call a static method of a C# class from VBA via
COM?](https://stackoverflow.com/q/24193183/9014308)

上記記事の回答には、COMとして登録可能な形にして、その中に static method を含める方法を取るようです。以下のようになるのでは？  
これで呼び出せるかどうかは確かめていませんが。

```

    using System.Runtime.InteropServices;
    
    [ComVisible(true)]
    public class Class1
    {
        [ComVisible(false)]
        public static string getMsg()
        {
            return "Hello World.";
        }
    
        // staticなmethodのみだとビルドで警告が残るので、ダミーでも何かstaticではないものを追加
        public string getLastMsg()
        {
            return "Bye.";
        }
    }
    
```

* * *

訂正追記：

元記事を読み直すとやはり直接は呼び出せないようなので、おそらく以下になるのでしょう。

```

    using System.Runtime.InteropServices;
    
    [ComVisible(true)]
    public class Class1
    {
        [ComVisible(false)]
        public static string getMsg()
        {
            return "Hello World.";
        }
    
        // staticなmethodをラップして間接的に呼び出す。
        public string getMsgIndirect()
        {
            return getMsg();
        }
    }
    
```

* * *

それから、用途によっては、以下記事で紹介している何かが使えるかもしれません。  
[アドインの開発方法について](https://office-fun.com/develp-o-addin/)

ExcelならC++でXLLというのが比較的簡単にできそうです。  
[Excel で DLL にアクセスする](https://docs.microsoft.com/ja-jp/office/client-
developer/excel/how-to-access-dlls-in-excel)
CC BY-SA 4.0
2018-11-29T02:09:00.033
50734
2018-11-29T04:52:00.560
2018-11-29T04:52:00.560
26370
26370
50709
answer