无法在c#中加载文件或程序集

时间:2013-11-20 07:45:46

标签: c# sql-server oracle

我正在使用连接到sql server和oracle的程序集。 我可以选择天气我的应用程序应该连接到SQL Server或oracle。 顺便说一句,这个程序集在finally语句中抛出一个错误。

        try
        {
            switch (this.DataBaseType)
            {
                case DataBaseType.SqlServer:
                    _sqlLib.CommitTransaction();
                    break;
                case DataBaseType.Oracle:
                    _oraLib.CommitTransaction();
                    break;
            }
        }
        catch
        {
            throw;
        }
        finally
        {
            switch (this.DataBaseType)
            {
                case DataBaseType.SqlServer:
                    _sqlLib.Close();
                    break;
                case DataBaseType.Oracle:
                    _oraLib.Close();
                    break;
            }
        }

_oraLib是另一个使用Oracle.DataAccess.dll的类。

在这个应用程序中,我没有使用oracle而是使用sql server。

所以,我没有将Oracle.DataAccess.dll复制到我的项目中。

在try语句中,它通过了。

但是在finally语句中,即使this.DataBaseType返回SqlServer,它也会抛出错误“无法加载文件或程序集~~~~'Oracle.DataAccess,Version = 4.121.1.0,Culture = neutral,PublicKeyToken = 89b483f429c47342'

如果我阻止     // _oraLib.Close();

没关系。它工作正常。

这是怎么回事?

我认为在我决定使用它之前不应该加载类的实例。

为什么我的应用程序抛出此错误,即使此DataBaseType指示SqlServer。

2 个答案:

答案 0 :(得分:2)

有时候会发生这种情况,因为oracle dll是32位,而你的应用程序是在64位上构建的 将应用程序更改为32位可能会解决您的问题

答案 1 :(得分:1)

如果您在代码中引用了一个dll,它将被加载,并且无论代码是否被命中都无关紧要。

如果你不想在发行版中包含oracle dll,你知道它不会被使用,你必须将它隐藏在抽象之后,并在运行时手动加载所需的程序集。

你可以使用依赖注入和一个像Castle Windsor

这样的体面容器来做到这一点

编辑: 为了澄清,您可以在项目引用中添加对dll的引用,并且在代码中的某个位置使用它之前不会加载它。正如James所说,当JIT编译发生时会发生这种情况,因此无需运行调用dll的实际代码行。