我在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是否容易做到,例如声明性地......
答案 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共存,所以希望这也不会成为问题。