2012-07-18 48 views
1

我有一些域類具有Type(屬性)類型的屬性。序列化一個域類型的類型

用戶可以使用自定義TypeBrowserEditor選擇在他的項目中加載的任何類。

序列化工作正常,我序列化爲myType.AssemblyQualifiedName

但反序列化過程中,由於大會沒有在應用程序域加載Type.GetType(STR)返回null。

我不能做AssemblyLoad(str),因爲他找不到文件。

我需要訪問IVSHierarchy並枚舉用戶項目的引用。但是我找不到在我的DomainPropertyXmlSerializer中訪問它的方法。如果任何人都可以將我指向服務提供商的正確方向,或者讓我連接VS當前項目,那就太好了。

在此先感謝。

編輯:我最糟糕的情況只能用字符串工作,只投它在我的編輯器類型的,因爲我可以有機會獲得IVSHierarchy有,但我真的不喜歡這種解決方案。

+0

你是不是想從Visual Studio的外部訪問IVSHierarchy?例如當用戶運行你的應用程序? – 2012-07-18 20:38:10

+0

offcourse不:) – 2012-07-18 20:44:16

回答

0

好,我設法做到這一點!

在DslPackage,使DocData.cs,並在其中創建了MyLanguageDocData類(部分)的一部分

則:

protected override void OnDocumentLoading(EventArgs e) 
    { 
     mRes = new ResolveEventHandler(CustomAssemblyResolverDocData); 
     availableTypes = new Dictionary<string, Type>(); 
     availableAssemblies = new Dictionary<string, Assembly>(); 
     PreloadAssemblies(); 
     if (availableAssemblies.Count == 0) 
      throw new Exception("Problem"); 

     base.OnDocumentLoading(e); 
     AppDomain.CurrentDomain.TypeResolve += mRes; 
     AppDomain.CurrentDomain.AssemblyResolve += mRes; 
    } 

的異常情況發生時,設計師之前打開解決方案已加載(當您在編輯設計時關閉Visual Studio時發生)。 在此處拋出異常將防止負載悄無聲息地發生。

在PreloadAssemblies:

IVsHierarchy hier = VsHelper.ToHierarchy(dteProject); 
DynamicTypeService typeService = (DynamicTypeService)this.GetService(typeof(DynamicTypeService)); 
ITypeDiscoveryService discovery = typeService.GetTypeDiscoveryService(hier); 

try 
{ 

    foreach (Type type in discovery.GetTypes(typeof(object), true)) 
    { 
     if (!availableTypes.ContainsKey(type.FullName)) 
     { 
      availableTypes.Add(type.FullName, type); 
     } 
     if (!availableAssemblies.ContainsKey(type.Assembly.GetName().Name)) 
     { 
      availableAssemblies.Add(type.Assembly.GetName().FullName, type.Assembly); 
     } 
    } 
} 
catch (Exception e) 
{ 

} 

而且在分解剛剛檢查程序集名稱在字典中。否則返回null。

覆蓋的DocumentClosed以及去除大會解析器:)

相關問題