IBM DB2问题 – System.BadImageFormatException:无法加载文件或程序集IBM.DB2.DLL或其依赖项之一

我收到上面提到的错误消息。 我已经做了足够的研究并尝试了各种选择,但仍然没有运气。

以下是详细信息:

OS: Windows 7 64 bit version Visual studio version: 2013 Premium .NET framework version is : 4.0.30319 ASP.NET version: 4.0.30319.34249 IIS version: 7.0 DB2 installed path: C:\Program Files (x86)\IBM DLL path: C:\Program Files (x86)\IBM\SQLLIB\BIN\netf40\IBM.DB2.dll DLL Version: 9.7.4.4 

我还将我的解决方案配置管理器平台更改为任何CPU ,并且我还通过将属性启用32位应用程序设置为True来更改应用程序池中的设置。

但仍然得到同样的错误。 还有其他解决方法吗?

请帮我提一下你的建议。

在我的情况下,这是在Windows Server 2012 R2 Standard中发生的,这是由于未在全局缓存程序集中安装的程序包导致的错误,请确保检查C:\ Windows \ Assembly以确保您的程序在GAC_32,GAC_64下正确安装,你应该看到

在此处输入图像描述

如果不是这就是我必须做的才能解决它。

1)我必须检查我安装的版本以确保兼容性。

2)由于存在错误,“IBM DATA SERVER CLIENT”无法使用GUI正确安装,因此必须以管理员身份使用此方式静默运行

3)由于服务器性质,我不得不使用IBM-Steps < - Link安装.Net 3.5这对我不起作用所以我不得不使用MS-Steps < - Link与这些行

 DISM /Image:C:\test\offline /Enable-Feature /FeatureName:NetFx3 /All /LimitAccess /Source:D:\sources\sxs 

4)通过检查C:\ User_Dir \ Document \ DB2LOG中的DB2LOG文件夹,发现其中一个问题是“IBM DATA SERVER CLIENT”仍未正确安装

5)必须在我的情况下安装“IBM DATA RUN TIME CLIENT”最新修复9.7是修复10,可以在IBM的下载页面上免费访问,你只需要注册它需要1分钟,你得到一个响应尽快,确保你跟进,等到你的愚蠢因素开始…. ……

6)然后我能够安装“IBM DATA SERVER CLIENT”

7)仔细检查以确保您可以看到“DB2COPY1”或您选择调用安装副本的任何内容。

在此处输入图像描述

我相信你不需要两者,但是我不会把这个东西弄得乱七八糟。

这个问题现在发生在我身上,并且按照IBM文档的说法解决了这个问题,即转到项目中的引用并为DB2 dll设置“Copy local”为false,直接引用DB2客户端设置中的引用

我将跳到这里,并完全自动化从IBM部署.Net数据提供程序,因为这是我遇到的许多错误中的第一个,试图让它工作。 我希望通过阅读这些步骤,有人避免被置于痛苦之中。

  1. 使用nuget添加对DB2 .Net数据提供程序的引用: https ://www.nuget.org/packages/IBM.Data.DB2/您会注意到它会给您一些您将要忍受的痛苦的提示: 注意 – 此packakge要求在本地安装IBM DB2客户端软件,并在%PATH%环境变量上提供。
  2. 接下来,您需要将刚刚引用的DLL设置为不包含在BIN文件夹中,方法是将DLL设置为Copy Local FALSE by Right单击引用并转到属性。

    如果将这些放入BIN,您将收到错误消息:

    [BadImageFormatException:无法加载文件或程序集’IBM.Data.DB2’或其依赖项之一。 试图加载格式不正确的程序。]

    IBM对该问题的引用: http : //www-01.ibm.com/support/docview.wss?uid = swg21902663

  3. 现在,为了开始开发,您需要从这里安装驱动程序包或运行时客户端https://www-945.ibm.com/support/fixcentral/ (祝您好运)或者您将收到以下错误:

    exception消息:无法加载文件或程序集“IBM.Data.DB2,Version = 9.7.4.4,Culture = neutral,PublicKeyToken = 7c307b91aa13d208”或其依赖项之一。 该系统找不到指定的文件。

  4. 开发时间! 玩得开心!
  5. 现在您需要部署并意识到自动安装DB2驱动程序并开始寻找解决方案时遇到问题:

    如何正确部署IBM DB2数据提供程序

    ASP.NET – IIS7 – IBM DB2问题

    不想在DEV / QA / STG / PROD上手动安装,我发现您可以使用响应文件通过命令行静默安装IBM Data Server Client Package。 大约在此页面的一半: https : //www.ibm.com/support/knowledgecenter/SSEPGG_11.1.0/com.ibm.swg.im.dbclient.install.doc/doc/t0007315.html您将在以后找到相关信息这一行:

    要安装IBM Data Server Driver Package软件,请运行v10.5fpX_ntxYY_dsdriver_EN命令。 X表示修订包编号值,YY表示32位或64位版本。

    下面是一个示例响应文件的链接,用于复制和更改您的信息: https : //www.ibm.com/support/knowledgecenter/SSEPGG_11.1.0/com.ibm.db2.luw.apdv.sample.doc/doc /dsdriver/s-dsdriver-rsp.html

  6. 现在你们都准备好了吗? 错误。 显然,“成功安装”不包括将适当的DLL移动到GAC并在注册表中注册它们。 谢谢IBM: https : //www-01.ibm.com/support/docview.wss?uid = swg21618434

    我不想放弃自动部署梦想,将上述所有知识都放入Powershell脚本中:

     param([string]$driverPath,[string]$installPath) [System.Reflection.Assembly]::Load("System.EnterpriseServices, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a") $publish = New-Object System.EnterpriseServices.Internal.Publish Write-output "Installing v11.1.2fp2a_ntx64_dsdriver_EN.exe" & "$driverPath\v11.1.2fp2a_ntx64_dsdriver_EN.exe" /u "$driverPath\DB2.cfg" /l "$driverPath\log.txt" | Out-null $publish.GacInstall("$installPath\bin\netf20\IBM.Data.DB2.dll") | Out-null $publish.GacInstall("$installPath\bin\netf20_32\IBM.Data.DB2.dll") | Out-null $publish.GacInstall("$installPath\bin\netf40\IBM.Data.DB2.dll") | Out-null $publish.GacInstall("$installPath\bin\netf40_32\IBM.Data.DB2.dll") | Out-null $publish.GacInstall("$installPath\bin\netf20\IBM.Data.DB2.Entity.dll") | Out-null $publish.GacInstall("$installPath\bin\netf20_32\IBM.Data.DB2.Entity.dll") | Out-null $publish.GacInstall("$installPath\bin\netf40\IBM.Data.DB2.Entity.dll") | Out-null $publish.GacInstall("$installPath\bin\netf40_32\IBM.Data.DB2.Entity.dll") | Out-null 
  7. 现在您将发现您收到另一个错误。 到目前为止,你只是在与IBM.Data.DB2。*。dll问题作斗争。 现在出现以下错误:

    exception消息:无法加载DLL“db2app64.dll”:找不到指定的模块。 (HRESULTexception:0x8007007E)

    来吧IBM !! 快速Google搜索会找到与#1相同的结果。 “将您的应用更改为32位”这是错误的,当然,我们现在知道的更好!

    我会帮助你,并让你知道这个DLL与其他DLL一起安装,只是在不同的路径!

    只需将它们添加到Powershell脚本的底部:

     $publish.GacInstall("$installPath\bin\db2app.dll") | Out-null $publish.GacInstall("$installPath\bin\db2app64.dll") | Out-null 

现在,您拥有一个完全自动化的DB2 .Net Provider来连接DB2 Server。

希望这可以帮助。

编辑:你可以交替隔离所需的DLL,只包括文件夹中的那些(如/ lib /)并部署它们而不是用exe安装。 引用/ lib / location而不是驱动程序安装位置以移动到GAC。

听起来您正在尝试从以64位模式运行的.NET应用程序加载32位编译的IBM DB2驱动程序。 尝试更改配置管理器以在x86模式下运行。

我刚刚遇到这个问题。 我发现Visual Studio中的发布过程将IBM.Data.DB2.dll的副本放在Web应用程序的BIN目录中。 手动删除时,Web应用程序开始正常运行。 我不知道为什么它会被发表,因为它没有被直接引用。

我发现解决此问题的最简单方法是使用Post-build事件。

项目属性 – >构建事件 – >构建后事件命令行

这是我正在使用的命令行:

 del $(TargetDir)\IBM.Data.DB2.dll