3

わかりましたので、ここに私の問題があります:

メソッドとそのパラメーターが記録されたxmlファイルがあります。この xml ファイルには、次の .net ジェネリック インターフェイス タイプ名を持つ ID 値のリストが記録されています。

System.Collections.Generic.IList`1[CoreLib.Domain.MyClass]

これらのパラメーターのほとんどが汎用リストまたは辞書になることはわかっています。xml から読み取っている文字列値で GetType を使用しようとすると、すべて null が返され、スロー例外フラグを true に設定しようとすると、次のメッセージがスローされます。

「アセンブリ 'TestLibrary、Version=1.0.0.0、Culture=neutral、PublicKeyToken=null' からタイプ 'CoreLib.Domain.MyClass' を読み込めませんでした。」

移入できる実際の型を引き戻すことができるものを取得するための最良の戦略は何ですか? 前もって感謝します!

更新次のような文字列名にアセンブリ参照を追加しようとしました:

Type.GetType("System.Collections.Generic.List`1[CoreLib.Domain.MyClass,CoreLibrary]")

また

coreLibAssembly.GetType("System.Collections.Generic.List`1[CoreLib.Domain.MyClass,CoreLibrary]")

どちらも null オブジェクトになります。または、例外のスローを要求すると、アセンブリ名を指定しなかった場合と同じメッセージが表示されます。Assembly Binding Log Viewer も使用しようとしましたが、リストにアプリケーションが表示されず、コードを実行した後にアプリ内に何も表示されないようです (nunit によって実行されるテスト プロジェクトにあります)。

何かご意見は?

4

2 に答える 2

1

通常、文字列をそのまま Type.GetType() に渡すことができます。例えば:

Type t = Type.GetType("System.Collections.Generic.Dictionary`2[System.String,System.Int32]");

あなたの場合、CLR は type を解決する方法を知らないのではないかと思いますCoreLib.Domain.MyClassMSDN から取得したこの例のように、アセンブリを指定することで、それを支援する必要がある場合があります。

Type.GetType("System.Collections.Generic.Dictionary`2[System.String,[MyType,MyAssembly]]")

アセンブリを指定した後もまだ「爆発」している場合 (次回は、特定のエラー、例外、またはスタック トレースなどを使用してより適切に定義することをお勧めします:-) Fusion Log Viewer を管理者として実行してみてください(そうしないと、サイレントに失敗します) バインドをログに記録します失敗。

于 2012-06-13T00:44:09.493 に答える
0

私はそれを理解しました。問題は、アセンブリがどのように参照されるか、および GetType メソッドがどのアセンブリがどこにあるのかをどのように把握するかです。GetTypeのAssembly Resolver匿名デリゲートでこの問題を解決することになりました。

    result = Type.GetType(typeName + ",mscorlib", //<-- needing to identify the mscorlib  for generics!
        //this anonymous delegate method is used by the GetType Framework to identify and return the correct assembly for the given assembly name.
        //most of this is default, except to handle the mscorlib library
        delegate(AssemblyName potentialAssembly)
        {
            if (potentialAssembly.Name == coreLibAssembly.FullName)
                return coreLibAssembly; // this was never called, I had to check the namespace within the rest of my code
            else if (potentialAssembly != null)
                return Assembly.Load(potentialAssembly);
            else
                return null;
        },
        //this anonymous delegate is used to return the type specific to the assembly. this method is called for each nested generic, 
        //so we don't have to parse the type string name by hand.
        delegate(Assembly potentialAssembly, string inputTypeName, bool ignoreCase)
        {
            if (inputTypeName.StartsWith("CoreLib.Domain"))
                return coreLibAssembly.GetType(inputTypeName, true, ignoreCase);
            else if (potentialAssembly != null)
                return potentialAssembly.GetType(inputTypeName, true, ignoreCase);
            else
                return Type.GetType(inputTypeName, true, ignoreCase);
        }, true);

ここで、汎用の Type.GetType(string typeName) が機能しない場合は、このコードを使用して型文字列を解析し、指定された typeName 文字列変数内の対応する型名にアセンブリを一致させます。

于 2012-06-13T19:42:58.687 に答える