【问题标题】:Serialize a domain type of Type序列化一个域类型 Type
【发布时间】:2012-07-18 17:18:10
【问题描述】:

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

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

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

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

我无法执行 AssemblyLoad(str),因为他找不到文件。

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

提前致谢。

编辑:我可能只使用 String 并在我的类型编辑器中转换它,因为我可以在那里访问 IVSHierarchy,但我真的不喜欢那个解决方案。

【问题讨论】:

  • 您是否尝试从 Visual Studio 外部访问 IVSHierarchy?例如用户何时运行您的应用程序?

标签: c# visual-studio-2010 dsl envdte


【解决方案1】:

好吧,我成功了!

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-13
    • 1970-01-01
    • 2023-01-20
    • 1970-01-01
    • 1970-01-01
    • 2013-02-18
    相关资源
    最近更新 更多