【发布时间】:2012-02-24 05:23:35
【问题描述】:
我正在开发一个 excel 插件,在这个插件中有几个 AppDomain。我需要访问每个 AppDomain 中的一些共享数据,所以我决定使用跨 AppDomain 单例。我遵循了该线程中描述的内容:
http://www.dolittle.com/blogs/einar/archive/2007/05/18/cross-appdomain-singleton.aspx
因为这是一个 excel 插件,所以我在创建包含单例的 AppDomain 时必须对其进行一些修改,以便在搜索程序集时使用正确的基本目录。以下是我修改后的版本:
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, out domain);
if (domain == null)
{
break;
}
AppDomain appDomain = (AppDomain)domain;
if (appDomain.FriendlyName.Equals(friendlyName))
{
return appDomain;
}
}
}
finally
{
host.CloseEnum(enumHandle);
Marshal.ReleaseComObject(host);
host = null;
}
return null;
}
public static T Instance
{
get
{
if (null == _instance)
{
AppDomain appDomain = GetAppDomain(AppDomainName);
if (null == appDomain)
{
string baseDir = AppDomain.CurrentDomain.BaseDirectory;
appDomain = AppDomain.CreateDomain(AppDomainName, null, baseDir, null, false);
}
Type type = typeof(T);
T instance = (T)appDomain.GetData(type.FullName);
if (null == instance)
{
instance = (T)appDomain.CreateInstanceAndUnwrap(type.Assembly.FullName, type.FullName);
appDomain.SetData(type.FullName, instance);
}
_instance = instance;
}
return _instance;
}
}
}
这是我对 CrossAppDomainSingleton 的实现:
public class RealGlobal : CrossAppDomainSingleton<RealGlobal>
{
//ExcelApp Value Shared
private Microsoft.Office.Interop.Excel.Application s_excelApp = null;
public Microsoft.Office.Interop.Excel.Application GetExcelApp()
{
return s_excelApp;
}
public void SetExcelApp(Microsoft.Office.Interop.Excel.Application app)
{
s_excelApp = app;
}
}
一旦我尝试使用 get 或 set 方法(我也尝试了一个属性但没有进一步),我系统地得到一个异常:
名不符实。 (来自 HRESULT 的异常:0x80020006 (DISP_E_UNKNOWNNAME))
或英文: 未知名称。 (来自 HRESULT 的异常:0x80020006 (DISP_E_UNKNOWNNAME))
当我保留内置类型时,编组工作正常,但鉴于我要访问的对象 (Microsoft.Office.Interop.Excel.Application) 是 COM 对象,我担心这就是问题所在。
我对远程处理和编组非常陌生。有任何想法吗?是不是跟COM对象的序列化有关系?
提前非常感谢! 肖恩
【问题讨论】:
标签: c# excel exception singleton appdomain