1

我有一些域类具有类型类型(类)的属性。

用户可以使用自定义 TypeBrowserEditor 选择在他的项目中加载的任何类。

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

但是在反序列化过程中,Type.GetType(str) 返回 null,因为程序集没有加载到应用程序域中。

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

我需要访问 IVSHierarchy 并通过用户项目的引用进行枚举。但我找不到在我的 DomainPropertyXmlSerializer 中访问它的方法。如果有人可以为我指出服务提供商的正确方向,或者无论如何让我连接到 VS 当前项目,那就太好了。

提前致谢。

编辑:在最坏的情况下,我只能使用 String 并将其转换到我的类型编辑器中,因为我可以在那里访问 IVSHierarchy,但我不太喜欢那个解决方案。

4

1 回答 1

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 以及删除程序集解析器:)

于 2012-07-18T20:50:57.513 回答