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

以最小的痛苦在进程外运行基于C#的Excel加载项,c#,.net,excel,com,C#,.net,Excel,Com,我在VS2005中开发了一个原型C#Excel 2003插件,它支持一个带有一些简单调用的对象,加上一个单独的RTD类,所有这些都位于一个现有的大型内部C#堆栈之上 一切正常,但 我被告知,为了避免与其他可能需要不同.Net运行时的Excel加载项发生潜在冲突,我将不得不将.Net代码从进程中推出 1) 这是真的吗 2) 是否可以按需自动启动out-of-proc服务器,只允许适当的用户访问(以简化安全问题),并且不需要精心安装,等等 3) 如果可以做到这一点,如何做到 当前我的(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
    {

    ...
    }
}
名称空间SimpleAddinMockup1
{
/// 
///非实时方法的Excel主入口点。
/// 
[ClassInterface(ClassInterfaceType.AutoDual),ComVisible(true)]
公共密封类干管
{
...
}
}

名称空间SimpleAddinMockup1
{
/// 
///将Excel实例的In-proc实时服务器外观连接到主服务器连接。
/// 
///注意:要在Excel中限制更新,请在两次更新之间使用“Application.RTD.ThrottleInterval=nnn”表示nnn ms(默认值为2000)。
///见:http://msdn.microsoft.com/en-us/library/aa140060(办公室10)aspx
[ClassInterface(ClassInterfaceType.AutoDual),ComVisible(true)]
公共密封类CPRTDServer:Excel.IRtdServer
{
...
}
}

更新:我仍然非常想知道推送C#outproc是否容易,例如以声明方式…

确实,在当前可用的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以解决特定的兼容性问题(在中的侧栏中进行了解释),但这已经通过Office update()解决了,该Office update()可以单独安装,也可以通过外接程序的安装程序安装(并且现在应该已经推送)。应用此更新后,Excel将自动加载最新的可用CLR版本

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

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
    {

    ...

    }
}