我正在開發一個excel插件,在這個插件中有幾個AppDomain。我需要訪問每個AppDomain中的一些共享數據,所以我決定使用跨AppDomain單例。我跟着什麼,在這個線程被描述:C#Excel插件 - 跨域單例例外
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方法(我試過一個屬性也,但沒有得到進一步的) ,我係統地得到一個例外:
Nom inconnu。 (來自HRESULT的異常:0x80020006(DISP_E_UNKNOWNNAME))
或英文: 未知名稱。 (從HRESULT異常:0x80020006(DISP_E_UNKNOWNNAME))
編組工作正常,當我保持內置類型,但鑑於我想訪問的對象(Microsoft.Office.Interop.Excel.Application)是一個COM對象,我擔心這是問題所在。我很新的Remoting和編組。有任何想法嗎?它是否與COM對象的序列化有關?
非常感謝提前! Sean
+1,因爲這解決了我的問題,無需幕後重構。 officezealot文章非常有用,並且文化在excel中對我們來說總是美國英語,所以不用擔心這一點。謝謝!!! – 2012-02-24 13:27:04