1

タイプ タイプ (クラス) のプロパティを持ついくつかのドメイン クラスがあります。

ユーザーは、カスタム TypeBrowserEditor を使用して、プロジェクトにロードされた任意のクラスを選択できます。

シリアル化は正常に機能します。myType.AssemblyQualifiedName としてシリアル化します。

ただし、アセンブリがアプリ ドメインに読み込まれていないため、逆シリアル化中に Type.GetType(str) は null を返します。

ファイルが見つからないため、AssemblyLoad(str) を実行できません。

IVSHierarchy にアクセスして、ユーザーのプロジェクトの参照を列挙する必要があります。しかし、DomainPropertyXmlSerializer でアクセスする方法が見つかりません。誰かがサービス プロバイダーの正しい方向性を教えてくれたり、とにかく VS の現在のプロジェクトに接続できるようにしてくれたりしたら、それは素晴らしいことです。

前もって感謝します。

編集:最悪のシナリオは文字列でのみ機能し、型エディターでキャストするだけで、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;
    }

例外は、ソリューションが読み込まれる前にデザイナーが開かれたときに発生します (デザインの編集中にビジュアル スタジオを閉じたときに発生します)。ここで例外をスローすると、ロードがサイレントに発生するのを防ぐことができます。

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 もオーバーライドして、Assembly リゾルバーを削除します :)

于 2012-07-18T20:50:57.513 に答える