Tag: appdomain

C#Excel插件 – 跨域单例例外

我正在开发一个Excel插件,在这个插件有几个AppDomain。 我需要访问每个AppDomain中的一些共享数据,所以我决定使用一个跨AppDomain单例。 我遵循这个线程中描述的内容: http://www.dolittle.com/blogs/einar/archive/2007/05/18/cross-appdomain-singleton.aspx 因为这是一个Excel插件,所以在创build包含单例的AppDomain时,我不得不对其进行修改,以便在search程序集时使用正确的基本目录。 以下是我的修改版本: public class CrossAppDomainSingleton<T> : MarshalByRefObject where T : new() { private static readonly string AppDomainName = "Singleton AppDomain"; private static T _instance; private static AppDomain GetAppDomain(string friendlyName) { IntPtr enumHandle = IntPtr.Zero; mscoree.CorRuntimeHostClass host = new mscoree.CorRuntimeHostClass(); try { host.EnumDomains(out enumHandle); object domain = null; while (true) { host.NextDomain(enumHandle, […]

Excel从两个不同的AppDomain调用.NET自动化服务器?

我有一个Excel插件(用C#编写),它是一个静态variables,位于单例数据caching的核心: static DataCache _instance; 这是通过三种不同的代码path访问的: VSTO ribbon-bar上的事件处理程序将初始化实例,并将其读取以在辅助对话框中显示 RTD服务器(声明为[ComVisible]并实现IRtdServer接口的类)使用RTD公式的数据 一组自动化调用(在声明为[ComVisible]的另一个类中实现)也可以对数据进行操作。 这些是通过在Excel工作表上的button被点击时调用的VBA代码调用的。 编辑(#3): 根据这些代码path被首先调用的顺序,我发现我的代码在两个独立的AppDomain中运行。 来自function区事件处理程序的所有访问都发生在名为“MyPlugIn.vsto”的AppDomain中。 如果这是对我的COM对象的第一次访问,那么所有的后续调用(包括RTD调用)都发生在同一个AppDomain中。 但是,如果第一次访问是通过RTD接口进行的,则该调用和所有后续的RTD调用都发生在名为“DefaultDomain”的AppDomain中。 (使用embedded式RTD公式加载保存的文档时会发生这种情况。)通过工具栏初始化和操作DataCache的后续调用仍然出现在“MyPlugIn.vsto”AppDomain中。 这意味着RTD公式总是像DataCache未初始化一样运行(因为在一个AppDomain中设置的静态variables在其他AppDomain中保持未初始化)。 看来,VSTO初始化时,Excel或VSTO正在创build一个AppDomain。 在此初始化之前通过COM互操作创build的对象位于默认AppDomain中,而之后创build的对象位于VSTO AppDomain中。 我如何确保使用相同的DataCache实例,而不pipe在哪个AppDomain中创build了我的RTD服务器对象?

防止代码被加载到另一个AppDomain

我们有一个通常工作正常的excel插件,我们没有设置使用AppDomains任何东西。 然而,其他一些插件似乎强制我们的代码第二次加载,我们最终让我们的代码在两个不同的AppDomains上运行(当我们要执行一个动作时,我们将它放在AppDomain 1上的队列中,然后,ExcelsonTime函数在AppDomain 2上运行出队方法,队列为空)。 所以,我的问题是:是否有一个简单的方法来解决这个问题,也许阻止我们的程序被加载两次或其他AppDomains ? 有没有人有任何其他的想法如何解决这个问题? 更新: 我们设法做的是在我们被调用的时候把我们的整个程序加载到其他的插件的AppDomain中,现在我们在相同的地方(曾经是“到其他域的网关”的地方,比如上面提到的动作队列函数): 当出现这种情况时,SynchronizationContext.Current似乎重置为null,例如对于function区上的每个单击处理函数的调用,SynchronizationContext.Current被设置为null。 我甚至尝试过debugging.Net代码,而且碰巧的是,框架会记住一个旧的同步上下文,当把所有的事情都弄回原来的样子时,旧的同步上下文就是空的。 任何人都可以在这个问题上给予任何帮助,我真的开始失去它?