无法加载文件或程序集

11

我正在开发一个使用 SqlServerCeNHibernate 的系统。如果我在驱动程序中添加了 System.Data.SqlServerCe 组件的引用,那么我可以很好地创建和运行针对数据库的查询。但是,在尝试使用 NHibernate 时,我遇到了以下异常:

mscorlib.dll 中发生了类型为“System.IO.FileNotFoundException”的一次首要机会异常
附加信息: 找不到文件 System.Data.SqlServerCe 或其某个依赖项。系统无法找到指定的文件。

我已经追踪到一个调用 Assembly.Load("System.Data.SqlServerCe") 的异常,它似乎应该能够正常工作。 System.Data.SqlServerCe 组件在 GAC 中(我也尝试过以本地引用并将 CopyLocal=true, 但无济于事),并且我可以正常使用其成员,那么为什么我不能显式加载它呢?当我在 Reflector 中打开组件时,它无法加载 System.Transactions 引用(我也尝试过将其添加为本地引用,再次无济于事),因此加载该组件可能是问题所在,而不是 System.Data.SqlServerCe 组件。

这是一个常见的问题吗?可能是系统配置错误吗?


1
看起来你从未听说过Fusion:http://www.hanselman.com/blog/BackToBasicsUsingFusionLogViewerToDebugObscureLoaderErrors.aspx - Andriy Volkov
哦,好工具。它给我的反馈是: LOG:之前看到了相同的绑定,并且以hr = 0x80070002失败。 ERR:在预下载检查期间发生无法恢复的错误(hr = 0x80070002)。 这似乎并不是很有用--它之前已经失败了,所以让我们再次失败?我需要阅读融合文档,希望能更好地理解这个问题。然而,我被指向了解决我的问题的方法--详见下文。 - Dathan
3个回答

8

显然,这可以通过在app.config文件中添加一个<qualifyAssembly>元素来解决。添加以下内容可以使我的应用程序顺利运行:

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <qualifyAssembly partialName="System.Data.SqlServerCe" fullName="System.Data.SqlServerCe, Version=3.5.1.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" />
    </assemblyBinding>
</runtime>

谢谢!


是的,上面提到的fullName确实是程序集的完整名称。它为CLR提供了查找和加载特定程序集所需的信息。您还可以在.config文件中的连接字符串中替换该fullName(而不是partialName)。 - nocache

2
这很可能与一些系统(误)配置有关。
然而,按设计 SQL Server CE 只是一个单独的 DLL,可以与你的产品一起分发。 这意味着你只需在 System.Data.SqlServerCe 的引用属性中设置 Copy localTrue,就完成了。

1
我曾经遇到过类似的问题。我的错误在于我试图执行位于../obj/x86/Release中的.exe文件,而我应该执行位于../bin/Release中的.exe文件。(我是C#的绝对新手)。
(我还注意到,在这个../bin/Release目录中,引用的.dll文件被本地复制了。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接