Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法在c中加载文件或程序集#_C#_Sql Server_Oracle - Fatal编程技术网

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

C# 无法在c中加载文件或程序集#,c#,sql-server,oracle,C#,Sql Server,Oracle,我正在使用连接到sql server和oracle的程序集。 我可以选择我的应用程序应该连接到sql server还是oracle。 顺便说一下,这个程序集在finally语句中抛出了一个错误 try { switch (this.DataBaseType) { case DataBaseType.SqlServer: _sqlLib.Commi

我正在使用连接到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语句中,它通过了OK

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

如果我拒绝 //_oraLib.Close()

很好,很好用

这是怎么回事

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


为什么即使此数据库类型指示SqlServer,我的应用程序仍会引发此错误。

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

如果您在代码中引用dll,它将被加载,而不管代码是否命中

如果您不想在知道不会使用oracle dll的情况下将其包含在发行版中,则必须将其隐藏在抽象后面,并在运行时手动加载所需的程序集

您可以使用依赖项注入和一个像样的容器(如

编辑:
为了澄清这一点,您可以在project reference中添加对dll的引用,直到它在代码中的某个位置被使用后才会加载。正如James所说,JIT编译时会发生这种情况,因此调用dll的实际代码行无需运行。

谢谢您的回答。我将尝试报告结果。顺便问一下,您知道原因是什么?如果原因是32/64混合,那么顺便说一下,处理数据库(它引用了Oracle.DataAccess.dll)的程序集的名称是“DbConn”。我的名为WebApp1的应用程序引用的是这个DbConn.dll和“WebApp1”“没有引用Oracle.DataAccess.dll.re:程序集加载-您所说的完全不是真的。除非显式加载引用的程序集,否则在JIT编译使用其类型之一的代码之前,不会加载引用的程序集。不过,DI方法是一种很好的方法。OP的代码引用这样的类型,因此它将尝试加载Oracle程序集。