C#でカスタムExcel関数を作成しようとしています(レポートデータをWeb APIからExcelにプルしたいと考えています)。ただし、Excelにアクセスすると、新しい自動化アドインを追加できますが、[非アクティブなアプリケーションアドイン]の下に表示されます。ここで何が問題になっていますか?
このブログ投稿に基づいてCOM自動化アドインを作成しました。そして、私のソースコードはここのGithubにあります。
VisualStudio2010およびExcel201064ビット(バージョン14.0)を搭載したWindow764ビットマシンで作業しています。私のプロジェクトは、.NETFramework4を使用してx64ビルド構成に設定されています。
私はインターフェースを使用しています:
namespace JS.Formulas
{
public interface IFunctions
{
double JsAdd(double a, double b);
}
}
そしてクラス:
using System;
using System.Runtime.InteropServices;
using Microsoft.Win32;
namespace JS.Formulas
{
[ComDefaultInterface(typeof(IFunctions))]
[Guid("652496B2-6F14-461B-98AF-D86B1BD5F439")]
public class Functions : IFunctions
{
[ComRegisterFunction]
public static void RegisterFunction(Type type)
{
string subkey = @"CLSID\{" + type.GUID.ToString().ToUpper() + @"}\Programmable";
Registry.ClassesRoot.CreateSubKey(subkey);
var key = Registry.ClassesRoot.OpenSubKey(@"CLSID\{" + type.GUID.ToString().ToUpper() + @"}\InprocServer32", true);
if (key != null)
{
key.SetValue("", String.Format("{0}\\mscoree.dll", Environment.SystemDirectory), RegistryValueKind.String);
}
}
[ComUnregisterFunction]
public static void UnregisterFunction(Type type)
{
string subkey = @"CLSID\{" + type.GUID.ToString().ToUpper() + @"}\Programmable";
Registry.ClassesRoot.DeleteSubKey(subkey, false);
}
public double JsAdd(double a, double b)
{
return a + b;
}
}
}
次のように、64ビットバージョンのregasmを使用してコンポーネントを登録するビルド後のイベントを設定しました: "%Windir%\ Microsoft.NET \ Framework64 \ v4.0.30319 \ regasm" "$(TargetPath)"