2

私のコードはこのようなものです

public static object getClassInstance(string key, params  object[] constructorArgs)
        {
            string assemblyPath = null;
            string customClassName = null;
            DataSet objDataset = getAssemblyInfo(key);
            if (objDataset != null && objDataset.Tables.Count > 0 && objDataset.Tables[0].Rows.Count > 0)
            {
                assemblyPath = objDataset.Tables[0].Rows[0]["ACA_ASSEMBLY_PATH"].ToString();
                customClassName = objDataset.Tables[0].Rows[0]["ACA_CLASS_NAME"].ToString();
            }

            Assembly assembly;
            Type type;

            if (assemblyPath != null && assemblyPath != string.Empty)
            {
                assembly = Assembly.LoadFile(assemblyPath);
                type = assembly.GetType(customClassName);
            }
            else // if no customisation
            {
                type = Type.GetType(key);
            }

            object classInstance = constructorArgs == null ? Activator.CreateInstance(type) : Activator.CreateInstance(type, constructorArgs);
            if (classInstance == null) throw new Exception("broke");
            return classInstance;

        }

上記のコードでは、キーを namespace-qualified として渡しています。// コードのカスタマイズ セクションが数日間完全に機能していなかった場合。それから突然、それは動揺し始めました。場合によっては文字列からクラス名を返し、場合によってはそうではありません(nullを返します)。キーから生成されるすべてのクラス名は、このメソッドからアクセスできます。そのようなアクセシビリティの問題はありません。

ドキュメントhttp://msdn.microsoft.com/en-us/library/w3f99sx1.aspxを見ました。備考欄にそう書いてある

GetType は、ディスクから読み込まれたアセンブリに対してのみ機能します。GetType を呼び出して、System.Reflection.Emit サービスを使用して定義された動的アセンブリで定義された型を検索すると、一貫性のない動作が発生する可能性があります。動作は、動的アセンブリが永続的であるかどうか、つまり、System.Reflection.Emit.AssemblyBuilderAccess 列挙体の RunAndSave または Save アクセス モードを使用して作成されているかどうかによって異なります。動的アセンブリが永続的で、GetType が呼び出される前にディスクに書き込まれている場合、ローダーはディスク上に保存されているアセンブリを見つけ、そのアセンブリを読み込み、そのアセンブリから型を取得します。GetType が呼び出されたときにアセンブリがディスクに保存されていない場合、メソッドは Nothing を返します。GetType は一時的な動的アセンブリを認識しません。したがって、一時的な動的アセンブリで GetType を呼び出して型を取得すると、Nothing が返されます。

それは私に問題を引き起こしている何かですか?. 誰でも助けることができます。

4

0 に答える 0