1

MVCプロジェクト、2つのWCFプロジェクト、およびサービスレイヤー(ビジネスオブジェクト、リポジトリなど)を含むコードベースがあります。また、共通コードのアセンブリ(これを単にcommonと呼びます)があり、これには次のコードが含まれています。

a)コードベース間で共有され、b)他のプロジェクトで再利用されることを目的としたコード。

この共通コードの一部は、Common.Webと呼ばれる名前空間です。この名前空間には、現在のMVCアプリで使用され、将来のアプリ(監査ログなど)で使用することを意図して作成したMVC属性が含まれています。

とにかく、私のWCFサービスは、何ヶ月もの間、私の共通のアセンブリを喜んで参照してきました。彼らは明らかにSystem.Web.Mvc.dllを参照する必要のあるクラスを使用していません。なぜなら、それらのクラスでは何も参照していないため、.NETはSystem.Web.Mvcを読み込もうとしないからです。 .dll。

しかし、今日私は問題に遭遇しました。WCFサービスの1つから呼び出されるコードを共通アセンブリに追加しました。このコードは、EFコードファーストを介してデータベースに書き込みます。これは、次のような単純なクラス(およびDbContext)です。

using System.Data.Entity;
using System;
using System.ComponentModel.DataAnnotations;

namespace Rsts.Common.Clients.Transcend
{
    public class TransactionAuditContext : DbContext
    {

        public TransactionAuditContext(string connString)
            : base(connString)
        {

        }

        /// <summary>
        /// DbSet of AuditEventTypes
        /// </summary>
        public DbSet<TransactionDetails> Transactions { get; set; }

    }

    public class TransactionDetails
    {

        [Key()]
        public Int64 TransactionID { get; set; }

        public Int64 PageRequestID { get; set; }

        public string TransactionRequestData { get; set; }

        public string TransactionReturnData { get; set; }

    }
}

このようなコードを実行するとすぐに:

context.Transactions.Add(new TransactionDetails());

ReflectionTypeLoadExceptionが発生しますが、その理由はSystem.Web.Mvc.dllが見つからないためです。Common dllでSystem.Web.Mvc.dllを参照していますが、このコードはSystem.Web.Mvc.dllのタイプを参照していないため、.NETがMVCをロードしようとする理由はありません。 。

ReflectionTypeLoadExceptionのTypesプロパティを見ると、使用しているかどうかに関係なく、.NETがCommonアセンブリ内のすべての型を読み込もうとしているようです。それで、.NETがアセンブリ内のすべてのタイプをロードする原因となる状況はありますか?アセンブリが何度も参照されるため、.NETがアセンブリ内のすべてのタイプをロードするだけのポイントはありますか?(これは私の共通アセンブリであるため、頻繁に参照されることを忘れないでください)。

どんな助けでもいただければ幸いです。

4

1 に答える 1

1

追加のアセンブリがロードされている(すべてが一度参照されるわけではない)場合の1つのケースは、Assembly.GetTypes()であり、存在しないアセンブリの型から派生した型があります。通常、これらの型を使用しない場合、このようなコードは正常に実行されますが、GetTypes()を呼び出すとすぐに失敗します。

于 2012-08-21T21:39:40.640 に答える