1

我有一个代码库,其中包含一个 MVC 项目、两个 WCF 项目和一个服务层(业务对象、存储库等)。我还有一个通用代码的程序集(我将称之为 common),其中包含的代码是

a) 在代码库之间共享,b) 旨在在其他项目中重用的代码。

这个通用代码的一部分是我称为 Common.Web 的命名空间,其中包含在我当前的 MVC 应用程序中使用的 MVC 属性,以及我编写的打算在未来的应用程序中使用的属性(例如审计日志等)。

无论如何,我的 WCF 服务几个月来一直在愉快地引用我的通用程序集。他们显然不使用任何需要引用 System.Web.Mvc.dll 的类,因为,好吧,他们不引用这些类中的任何内容,因此 .NET 不会尝试加载 System.Web.Mvc .dll。

然而,今天我遇到了一个问题。我将代码添加到从我的 WCF 服务之一调用的 Common 程序集中。此代码通过 EF Code First 写入数据库。它是一个简单的类(和 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

加载额外程序集(并非全部引用一次)的一种情况是 Assembly.GetTypes() 并且您的类型派生自不存在的程序集中的类型。通常,如果您不使用这些类型,这样的代码会运行正常,但是一旦调用 GetTypes(),它就会失败。

于 2012-08-21T21:39:40.640 回答