0

我正在尝试在 C# 中创建一个自定义 Excel 函数(我希望将报告数据从 Web API 提取到 Excel 中)。但是,当我进入 Excel 时,我可以添加新的自动化插件,但它列在“非活动应用程序插件”下,这里出了什么问题?

我根据这篇博文创建了一个 COM 自动化插件。我的源代码在 Github 上

我正在使用 Visual Studio 2010 和 Excel 2010 64 位(版本 14.0)的 Window 7 64 位机器上工作。我的项目设置为 x64 构建配置,使用 .NET Framework 4。

我正在使用一个界面:

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)"

4

1 回答 1

3

我决定为此使用Excel DNA 项目。花了 5 分钟让我的自定义功能正常工作,文档也很清晰(浏览 MSDN 文档后令人耳目一新)。

于 2013-01-15T13:49:19.553 回答