1

我有一个我们最近修改过的项目。该项目是用 .NET 编写的,并为 x64 机器编译。我有一个我们为与数据库交互而构建的 DataEntities 模型。但是,当我们尝试连接到实体框架模型时,会出现错误。

实体框架 edmx 文件称为 DataCentral.edmx。使用此文件,我们尝试运行以连接到我们的实例的代码非常简单。

        string cs = CSManager.GetConnectionString();
        DataCentralEntities ctx = new DataCentralEntities(cs);

当我们运行这两行时,它在第二行崩溃,内部异常:

Could not load file or assembly 'Interop.SHDocVw, Version=1.1.0.0, 
Culture=neutral, PublicKeyToken=null' or one of its dependencies. 
An attempt was made to load a program with an incorrect format.

当我们将它作为 x86 运行时(由于其他原因,从长远来看这是不可能的)它运行得很好。我确实检查了连接字符串,它的格式正确。

这是我的问题:我没有在我的任何新更改中使用 ShDocVw。事实上,在我遇到这个错误之前,我什至从未听说过它。到底是什么导致这吐在这里?我错过了什么?

更新

我们发现了一个可能是在 .NET 2.0 前后构建的表单。(可能更早。)它通过 ShDocVw 库创建了对 Web 浏览器控件(不是官方 WebBrowser 控件)的引用。显然,这是在官方控制出现之前将 Web 浏览器嵌入到您的应用程序中的一种相当常见的方式。

我们将此表单升级为使用官方 WebBrowser 控件,并删除了我们项目中对 ShDocVw.dll 的所有引用,现在一切都按预期工作,即使在 x64 中也是如此。

我仍然不明白的是,当您的项目中有对 ShDocVw.dll 的引用时,为什么实体框架会在该行崩溃。那部分对我来说毫无意义。然而,我们现在又重新站起来了。

4

1 回答 1

2

在某些情况下,EntityFramework 会尝试加载主程序集引用的程序集(最值得注意的是,它发生在 EF 正在寻找预编译视图时)。在您的情况下,这会导致异常,这将导致将 32 位程序集加载到 64 位进程中。请注意,如果有其他任何尝试加载此程序集,也会发生同样的情况。您需要使用 64 位程序集或将项目构建为 32 位。另一种选择是使用 Corflags 将您的起始程序集设置为 32 位,这将导致在 64 位计算机上创建 32 位进程,因此您将能够加载以前导致问题的程序集。

于 2013-03-12T02:22:49.703 回答