如何在VSTO项目中注册UDF / RTD

时间:2011-02-24 11:00:50

标签: c# com vsto registration user-defined-functions

所有

这是我的问题here的后续跟进。

我的设置:

  • Visual Studio 10
  • 语言C#
  • Excel 2007 +
  • Windows XP +

我想要达到的目的是:

  • 使用自定义功能区组件和自定义任务窗格
  • 为Excel创建VSTO插件
  • 创建RTD服务器
  • 创建一些包装=RTD()的UDF - 调用Excel用户
  • 让客户通过ClickOnce安装
  • 安装Addin

除了上一个要求,我基本上完成了。我唯一的问题是在不使用regasm.exe 的情况下在目标机器上注册RTD服务器和UDF。 我基本上希望客户端确实单击一次然后忘记它,特别是因为有数百个潜在用户,所有用户都在地理上分布在全世界。

此外,由于他们不精通技术,我不希望他们必须手动注册COM组件或类似的东西。

我不关心UDF和RTD服务器是否是一个单独的项目,只要我可以通过ClickOnce将它们与VSTO addin一起注册并注册。

我查看了免注册的COM,但不是因为我能够在我的VSTO插件中使用它。 我所做的是创建第二个项目(library class)并尝试导出并注册它以用于COM互操作,然后将其包含到我的“主”项目中并在那里使用它:它要么不能编译({{{ 1}})或不注册。

互联网上有大量关于我的要求的不同部分的例子,但没有完整的monty。

我完全偏离了这里吗?有人可以指出我正确的方向,理想情况下提供一些示例代码/配置?

干杯, 澈

2 个答案:

答案 0 :(得分:2)

在Frank上面提供的链接的帮助下,我终于在我的ThisAddin课程中完成了这项工作:

private void ThisAddIn_Startup(object sender, System.EventArgs e)
    {
        RegistrationServices regsrv = new RegistrationServices();
        if (!regsrv.RegisterAssembly(GetType().Assembly, AssemblyRegistrationFlags.SetCodeBase))
        {
            throw new Exception("Failed to register for COM Interop.");
        }
    }

    private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
    {
        RegistrationServices regsrv = new RegistrationServices();
        if (!regsrv.UnregisterAssembly(GetType().Assembly))
        {
            throw new Exception("Failed to unregister for COM Interop.");
        }
    }

我知道这不太理想,但至少我知道如果我的插件已启动,所有COM对象都已注册...

答案 1 :(得分:1)

这可以使用在安装期间运行RegAsm.exe的安装程序类来完成。看到: How to register a .NET CCW with regasm from a Visual Studio 2008 Setup project

希望这有帮助, 弗兰克