1

背景:

我有一个使用 Enterprise Library 6.0 连接到 Oracle 数据库的 .NET 4.5 应用程序。为了使用 .NET 的 Oracle 数据提供程序,您必须使用 EntLibContrib.Data.OdpNet。

我有一个单独的项目和解决方案,其中包含连接到数据库并返回域对象的业务和数据访问逻辑。

问题:

我在另一个项目(在另一个解决方案中)中使用了这些程序集并遇到了问题。我添加了对以下内容的引用:

  • 通过构建其他解决方案生成的 .NET dll
  • Microsoft.Practices.EnterpriseLibrary.Common
  • Microsoft.Practices.EnterpriseLibrary.Data
  • EntLibContrib.Data.OdpNet

将适当的设置添加到配置后,它应该像在其他项目中一样工作——但是当我尝试连接到数据库时,我收到以下错误:

'EntLibContrib.Data.OdpNet.OracleDatabase, EntLibContrib.Data.OdpNet' 类型无法解析。请验证拼写是否正确或提供了完整的类型名称。

不久前我为这个错误创建了一个问题。我从未得到回应,但当我添加额外的配置信息时,问题似乎“自行修复”,但我从未深入研究导致问题的原因。

由于我再次遇到这个问题,我调查并缩小了范围,我需要引用一个属于 EntLibContrib.Data.OdpNet 的对象。如果我有一个引用一个对象,该对象引用一个属于 EntLibContrib.Data.OdpNet 的对象,它也可以工作。

我的解决方案只是在我的新项目的一个类中编写一个虚拟变量:

private static EntLibContrib.Data.OdpNet.OracleDataReaderWrapper dummyVarNotUsed; 

尽管 dummyVarNotUsed 从未使用过,但只需使用该行即可正确引用 EntLibContrib.Data.OdpNet 程序集。

这是一个 hack,有人可以阐明正在发生的事情以及如何更好地引用 dll 吗?

4

1 回答 1

1

根据这个问题和相关的答案,我建议尝试处理该AssemblyResolve事件,所以是这样的:

//in your startup method
AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.AssemblyResolve += new ResolveEventHandler(MyResolveEventHandler);

//...
private static Assembly MyResolveEventHandler(object sender, ResolveEventArgs args)
{
    //not sure if this will be what the name is, you'd have to play with it
    if (args.Name == "EntLibContrib.Data.OdpNet.OracleDatabase")
    {
        return typeof(EntLibContrib.Data.OdpNet.OracleDataReaderWrapper).Assembly;
    }
    //not sure if this is best practice or not (to return null if truly unknown)
    return null;
}

该答案确实表明您当前的解决方案是首选方法,但我同意它确实感觉很糟糕。不确定这种其他方法是否会让您感觉不那么老套;它对我来说至少这样你可以清楚地记录这个事件处理程序,而不是在某个地方有一个带有注释的虚假变量//DON'T REMOVE, VERY IMPORTANT!!!

于 2014-02-17T19:31:26.730 回答