6

私のコードは

type = Type.GetType(key);

私が渡すキーは名前空間修飾名です。

私のコードは BusinessLayer にあります。DataAccessLayer のインスタンスを作成しています。DataAccessLayer 参照が BusinessLayer に追加されました。

「アセンブリ 'BusinessLayer、Version=1.9.3.0、Culture=neutral、PublicKeyToken=null' からタイプ 'Catalyst.DAL.ExamDAO.CExamDAO' をロードできませんでした」というエラーが表示されます。.

クラスが DataAccessLayer からのものであることを明示的に指定するにはどうすればよいですか?

キー値は「Catalyst.DAL.ExamDAO.CExamDAO」です

編集 :

私の実際のコードは

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;

        }

カスタマイズがない場合は、デフォルトのクラスをロードしようとしています。メソッドは BO にあります。キーを任意の Bo 型の名前空間修飾名として渡すと、変換されます。しかし、DAOタイプはそうではありません

4

5 に答える 5

3

呼び出し元のアセンブリに型が存在しない場合は、 を使用しAssemblyQualifiedNameて Type インスタンスを取得する必要があります。問題を解決するには、代わりに を使用keyして値を設定する必要があります。AssemblyQualifiedNamenamespace qualified name

于 2011-09-16T07:11:19.977 に答える
2

それがどのようなタイプであっても 内にあることがわかっている場合は、できるだけ簡単に参照をDataAccessLayer取得します。Assembly

 Assembly assembly = typeof(AnyPublicTypeWithinTargetAssembly).Assembly;
 Type type = assembly.GetType(namespaceQualifiedTypeName);

Type.GetType別の方法として、アセンブリ修飾名を使用することもできますが、型名を指定するという点では、より長くなります。

于 2011-09-16T06:38:52.557 に答える
0

CExamDAOがのサブクラスである場合ExamDao、表記は次のようになります(に注意してください+)。

Catalyst.DAL.ExamDAO+CExamDAO

できる最善のことは、CExamDAOを直接作成してから、それを取得することですGetType().AssemblyQualifiedName(たとえば、デバッガーで)。何かのようなもの:

(new CExamDAO()).GetType().AssemblyQualifiedName

または(必要な場所が確実な場合は、アセンブリがすでにロードされています)

(new CExamDAO()).GetType().FullName

次に、それをコピーしてコードに貼り付けます。

于 2011-09-16T07:10:51.573 に答える
0

あなたのタイプは公開されていますか?内部クラスを別のアセンブリから読み込むことはできません。

于 2011-09-16T07:12:30.650 に答える