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