C#でXLLアドインを作成する

# はじめに
Excel-DNAを使用してC#で自作のワークシート関数(ユーザー定義関数、User-defined functions、UDFs)を作成する方法です。VBAマクロで作成した関数と異なり、高速で処理をすることができます。

[Free and easy .NET for Excel | Excel-DNA](https://excel-dna.net/)  
[Excel-DNA · GitHub](https://github.com/Excel-DNA)  
[NuGet Gallery | ExcelDna.AddIn](https://www.nuget.org/packages/ExcelDna.AddIn/)  

サンプルとして引数を倍にするだけの関数を作成します。  
![nibai.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3193449/0bcc5e87-2141-c6c8-f633-73c88be2e66d.gif)


# 作成方法

1. nugetでExcel-DNAをダウンロードします。（作業フォルダを`C:\work`とします）

   `C:\work>nuget install ExcelDna.AddIn -version 1.5.1`
    
2. `C:\work\ExcelDna.AddIn.1.5.1\tools`を開きます。


3. Excel-DNAを使用する場合「xllファイル（`ExcelDna64.xll`）」と対になる「dnaファイル（`ExcelDna64.dna`）」が必要で、このdnaファイルにコードを記載します。以下のコードを`ExcelDna64.dna`として保存します。これで完成です。

   ![csxll010.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3193449/6616f505-f31b-aa70-e6f9-8fe624621353.png)

   ```cs:ExcelDna64.dna
   <?xml version="1.0" encoding="utf-8"?>
   <DnaLibrary RuntimeVersion="v4.0" Language="CS">
   <![CDATA[
      namespace exceldna_sample
      {
         public class Class1
         {
            public static double nibai(double x)
            {
                  return x * 2;
            }
         }
      }
   ]]>
   </DnaLibrary>
   ```

# 使用方法

`C:\work\ExcelDna.AddIn.1.5.1\tools\ExcelDna64.xll`をアドイン登録して使用します。詳細は以下を参照願います。  

[C++でXLLアドインを作成する - Qiita](https://qiita.com/nekotadon/items/fbcdf1a9e079df33a099)

# 補足説明

* 「xllファイルとdnaファイル」でワンセットです。この2つのファイルは同じ名前で同じ場所に置きます。同じ名前であれば、`ExcelDna64.xll`、`ExcelDna64.dna`ではなく例えば`sample.xll`、`sample.dna`のようにリネームしても構いません。

* 32bitの場合は`ExcelDna.xll`を使用します。つまりデフォルトのファイル名のまま使用する場合は`ExcelDna.xll`と`ExcelDna.dna`の組み合わせで使用します。

* xllファイルとdnaファイル（と外部ライブラリ）を1つのファイルにまとめる場合は、`ExcelDnaPack.exe`を利用します。

   `C:\work\ExcelDna.AddIn.1.5.1\tools\ExcelDnaPack.exe ExcelDna64.dna`

   これにより1ファイル化された`ExcelDna64-packed.xll`が作成されます。もし`sample.xll`と`sample.dna`の組み合わせであれば`ExcelDnaPack.exe sample.dna`で作成します。

*  以下のようなことも可能です。`using System;`により`Convert`クラスのメソッドを使用しています。

   ```cs:ExcelDna64.dna
   <?xml version="1.0" encoding="utf-8"?>
   <DnaLibrary RuntimeVersion="v4.0" Language="CS">
   <![CDATA[
      using System;

      namespace exceldna_sample
      {
         public class Class1
         {
            public static string DEC2BINex(int x)
            {
                  return Convert.ToString(x, 2);
            }
            public static int BIN2DECex(string x)
            {
                  return Convert.ToInt32(x, 2);
            }
            public static string BIN2HEXex(string x)
            {
                  return Convert.ToString(Convert.ToInt32(x, 2), 16).ToUpper();
            }
            public static string HEX2BINex(string x)
            {
                  return Convert.ToString(Convert.ToInt32(x, 16), 2);
            }
         }
      }
   ]]>
   </DnaLibrary>
   ```
* 実装はクラスライブラリで行い、Excel-DNAではそれを読み込むだけ、という方法も可能です。以下の例では引数を倍にするライブラリ`Class1.dll`を作成し、それをExcel-DNAで利用しています。

 1. Visual Studioなどで`Class1.cs`から`Class1.dll`を作成します。
  
      ```cs:Class1.cs
      //csc /target:library Class1.cs
      namespace ClassLibrary1
      {
         public class Class1
         {
            public static double nibai(double x)
            {
                  return x * 2;
            }
         }
      }
      ```

 2. `ExcelDna64.dna`と同じ場所に`Class1.dll`を置きます。
  
 3. `ExcelDna64.dna`の内容を下記のように変更します。

      ```cs:ExcelDna64.dna
      <?xml version="1.0" encoding="utf-8"?>
      <DnaLibrary RuntimeVersion="v4.0" Language="CS">
      <ExternalLibrary Path="Class1.dll" Pack="true" />
      </DnaLibrary>
      ```
 4. 必要に応じて`ExcelDnaPack.exe ExcelDna64.dna`で1ファイル化します。


# 参考

* [Excel-DNA Packing Tool | Excel-DNA](https://excel-dna.net/docs/archive/guides/exceldna-packing-tool/)  
* [Excel-DNA で XLL をつくる(その１) | supermab's blog](https://supermab.com/wp/excel-dna-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B%E3%81%9D%E3%81%AE%EF%BC%91/)  
* [Excel-DNA で XLL をつくる（その２） | supermab's blog](https://supermab.com/wp/excel-dna-%e3%81%a7xll%e3%82%92%e3%81%a4%e3%81%8f%e3%82%8b%ef%bc%88%e3%81%9d%e3%81%ae%ef%bc%92%ef%bc%89/)  
* [Excel-DNA で XLL をつくる（その３） | supermab's blog](https://supermab.com/wp/excel-dna-%e3%81%a7-xll-%e3%82%92%e3%81%a4%e3%81%8f%e3%82%8b%ef%bc%88%e3%81%9d%e3%81%ae%ef%bc%93%ef%bc%89/)  
* [Excel-DNA で XLL をつくる（その４） | supermab's blog](https://supermab.com/wp/excel-dna-%e3%81%a7-xll-%e3%82%92%e3%81%a4%e3%81%8f%e3%82%8b%ef%bc%88%e3%81%9d%e3%81%ae%ef%bc%94%ef%bc%89/)  
* [Excel-DNA で XLL をつくる（その５） | supermab's blog](https://supermab.com/wp/excel-dna-%e3%81%a7-xll-%e3%82%92%e3%81%a4%e3%81%8f%e3%82%8b%ef%bc%88%e3%81%9d%e3%81%ae%ef%bc%95%ef%bc%89/)  
* [Excel-DNA | OPCDiary](https://opcdiary.net/excel-dna/)  
* [Excel-DNA（1） - 静かに暮らしたい](https://chawatoyo.blog.fc2.com/blog-entry-34.html)  

その他XLLに関連する記事  
* [XLL を作成する | Microsoft Learn](https://learn.microsoft.com/ja-jp/office/client-developer/excel/creating-xlls?source=recommendations)  
* [Excel ソフトウェア開発キットへようこそ | Microsoft Learn](https://learn.microsoft.com/ja-jp/office/client-developer/excel/welcome-to-the-excel-software-development-kit?source=recommendations)  
* [「Excel」のXLLアドインが既定でブロックへ ～「Excel 97」からあるC/C++ベースのアドイン - 窓の杜](https://forest.watch.impress.co.jp/docs/news/1482468.html)  
* [注目の脅威：悪意のある Excel XLL アドインを使用した攻撃が増加中](https://gblogs.cisco.com/jp/2022/12/talos-xlling-in-excel-malicious-add-ins/)