我正在使用连接到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。
答案 0 :(得分:2)
有时候会发生这种情况,因为oracle dll是32位,而你的应用程序是在64位上构建的 将应用程序更改为32位可能会解决您的问题
答案 1 :(得分:1)
如果您在代码中引用了一个dll,它将被加载,并且无论代码是否被命中都无关紧要。
如果你不想在发行版中包含oracle dll,你知道它不会被使用,你必须将它隐藏在抽象之后,并在运行时手动加载所需的程序集。
你可以使用依赖注入和一个像Castle Windsor
这样的体面容器来做到这一点编辑: 为了澄清,您可以在项目引用中添加对dll的引用,并且在代码中的某个位置使用它之前不会加载它。正如James所说,当JIT编译发生时会发生这种情况,因此无需运行调用dll的实际代码行。