使基于C#的Excel加载项以最小的痛苦运行进程外

时间:2008-12-15 13:07:42

标签: c# .net excel com

我在VS2005中开发了一个原型C#Excel 2003加载项,它支持一个带有一些简单调用的对象,以及一个单独的RTD类,它们都位于现有的大型内部C#堆栈的顶层。

一切正常,但是......

我被告知,为了避免与可能需要不同的.Net运行时的其他Excel加载项的潜在冲突,我将不得不将.Net代码推送到这个进程外。

1)这是真的吗?

2)这样做是否可以按需自动启动out-of-proc服务器,只能访问适当的用户(以简化安全问题),不需要精心安装等,等?

3)如果可以这样做,怎么做?

目前我的(COM可见)类存根开始:

namespace SimpleAddinMockup1
{
    /// <summary>
    /// Main entry point from Excel for non-real-time methods.
    /// </summary>
    [ClassInterface(ClassInterfaceType.AutoDual), ComVisible(true)]
    public sealed class Main
    {

    ...
    }
}

namespace SimpleAddinMockup1
{
    /// <summary>
    /// In-proc real-time server facade for an Excel instance to our main server connection.
    /// </summary>
    /// Note: to throttle updates in Excel use 'Application.RTD.ThrottleInterval = nnn' for nnn ms between updates (default is 2000).
    /// See: http://msdn.microsoft.com/en-us/library/aa140060(office.10).aspx
    [ClassInterface(ClassInterfaceType.AutoDual), ComVisible(true)]
    public sealed class CPRTDServer : Excel.IRtdServer
    {

    ...

    }
}

更新:我仍然非常想知道推送C#outproc是否容易做到,例如声明性地......

1 个答案:

答案 0 :(得分:2)

确实,对于当前可用的CLR版本(1.0,1.1和2.0),不同版本的CLR不能在一个进程中共存。但是,从理论上讲,只要Excel配置为加载2.0 CLR,就不会出现1.x加载项代码和2.0加载项代码共存的任何问题。当任何1.x加载项代码被加载时,它应该自动指向2.0 CLR,这是向后兼容的。

曾经有一段时间将Excel连接到未加载2.0 CLR以解决特定的兼容性问题(在this article的侧栏中进行了解释),但这已通过Office更新解决({{ 3}})可以单独安装,也可以与加载项的安装程序一起安装(现在应该已经被推送)。应用此更新后,Excel应自动加载最新的可用CLR版本。

微软目前的计划是,当4.0 CLR发布时(使用VS2010),它将能够在一个进程中与2.0 CLR共存,所以希望这也不会成为问题。