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

Posted

技术标签:

【中文标题】IBM DB2 问题--System.BadImageFormatException:无法加载文件或程序集 IBM.DB2.DLL 或其依赖项之一【英文标题】:IBM DB2 issue--System.BadImageFormatException: Could not load file or assembly IBM.DB2.DLL or one of its dependencies 【发布时间】:2015-08-19 07:18:03 【问题描述】:

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

以下是详细信息:

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,并且我通过将属性 enable 32-bit application 设置为 True 更改了应用程序池中的设置>.

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

请帮助我提出您的建议。

【问题讨论】:

【参考方案1】:

这个问题这几天发生在我身上,它是按照this IBM document says 解决的,即转到项目中的引用并将 DB2 dll 的“复制本地”设置为 false,直接引用 DB2 客户端设置中的那些

【讨论】:

【参考方案2】:

我要跳到这里,并采取我的步骤来完全自动化 IBM 的 .Net 数据提供程序的部署,因为这是我在尝试使其正常工作时遇到的许多错误中的第一个。我希望有人通过阅读这些步骤来避免陷入痛苦。

    使用 nuget 添加对 DB2 .Net 数据提供者的引用:https://www.nuget.org/packages/IBM.Data.DB2/ 你会注意到它暗示了你将要忍受的痛苦: NOTICE - This packakge requires the IBM DB2 client software to be installed locally and available on your %PATH% environment variable.

    接下来,您需要通过右键单击引用并转到属性将 DLL 设置为 Copy Local FALSE,将刚刚引用的 DLL 设置为不包含在 BIN 文件夹中。

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

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

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

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

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

    开发时间!玩得开心!

    现在您需要进行部署,并且您意识到自动安装 DB2 驱动程序存在问题并开始寻找解决方案:

    How to properly deploy IBM DB2 data provider

    ASP.NET -- IIS7 -- IBM DB2 Issue

    不想在 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 数据服务器驱动程序包软件,请运行 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

    现在你都准备好了?错误的。显然,“成功安装”不包括将适当的 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
    

    现在你会发现你得到了另一个错误。到目前为止,您只是在解决 IBM.Data.DB2.*.dll 问题。现在出现以下错误:

    异常消息:无法加载 DLL 'db2app64.dll':找不到指定的模块。 (HRESULT 异常:0x8007007E)

    加油 IBM!快速的谷歌搜索找到了与#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 服务器。

希望这会有所帮助。

编辑:您可以交替隔离所需的 DLL,仅将它们包含在文件夹中(如 /lib/)并部署它们,而不是使用 exe 安装。参考 /lib/ 位置而不是驱动程序安装位置以移动到 GAC。

【讨论】:

虽然你的帖子很老,但很有帮助。我这周的经历。 1.没有nuget包,安装客户端SDK确保环境正确(32/64位)。 2.包含在vs项目中后copy local设置为false。 3. 服务器安装(使用正确的环境 32/64 位主机应用程序) - 不包括 informix 驱动程序,只包括 db2.. 为 informix 运行客户端 sdk 安装。 4. 抛出缺少其他 dll 的异常。路径变量已更新,指向 install/bin 目录。重启服务器以使路径生效。无需在 GAC 中手动注册额外的 dll。 感谢您的出色回答。帮助我安装了这个野兽。一些陷阱:确保安装您拥有许可证的 Nuget 包和客户端运行时版本(并不总是最新版本)。当然,安装 *.cer 文件(并非所有安装都需要它)和 *.lic 许可证。更多关于许可证安装的信息:ibm.com/support/producthub/db2/docs/content/SSEPGG_11.5.0/… 您将使用客户端运行时来安装许可证。【参考方案3】:

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

如果不是,我必须这样做才能解决它。

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

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

3) 由于服务器性质,我必须使用IBM-Steps 安装.Net 3.5 MS-Steps

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”或您选择的安装副本。

我确定你不需要两者,但是我不会让登录者搞砸这个东西。

【讨论】:

原来这也发生在 Windows 8 上,安装程序在新的磁贴界面上存在问题。很奇怪,只需运行后期的 9.7fp10 x64 就可以了。【参考方案4】:

DB2 安装

从此 (https://www-01.ibm.com/support/docview.wss?uid=swg27016878) 链接下载最新的 IBM 数据服务器驱动程序包。 执行文件以管理员身份并保持默认值,除了它要求在本地驱动程序上安装功能的地方。单击它并选择在本地驱动器上安装所有功能和子功能...。不确定是否有影响。 驱动程序默认安装在C:\Program Files\IBM\IBM DATA SERVER DRIVER。 默认情况下,实例将安装在 C:\ProgramData\IBM\DB2\IBMDBCL1 中。默认实例名称是 IBMDBCL1。 您应该在 C:\ProgramData\IBM\DB2\IBMDBCL1\cfg 文件 db2dsdriver.cfg 中设置连接字符串。
 <dsncollection>       
  <dsn alias="DBDSNSAMPLE" name="DBDSNSAMPLE" host="127.0.0.1" port="50001"/>          
 </dsncollection>     
 <databases>       
  <database name="DBDSNSAMPLE" host="127.0.0.1" port="50001">                
  </database>          
 </databases> 
</configuration>
注意:您可以从程序和功能卸载驱动程序

添加连接后,您可以使用 testconn40.exe 测试连接。打开cmd,定位到C:\Program Files\IBM\IBM DATA SERVER DRIVER\bin,执行:

&gt; testconn40 DBDSNSAMPLE

此命令不会让您登录(因为我们没有在 .cfg 文件中指定用户凭据),但至少它会显示正确的消息,这意味着您的 .NET应用程序将工作。否则会显示一些异常错误。

Visual Studio 中的 DB2

从 nuget 安装 IBM.Data.DB2 包。 然后,在 References 中,您将看到 IBM.Data.DB2.dllIBM.Data.DB2.Entity.dll . 这里是测试代码:
   using (var conn = new DB2Connection($"Database=u.db2a;UserID=u.db2u;Password=u.db2p;Server=u.db2i"))
   using (var cmd = new DB2Command())
   

       cmd.CommandText = "SELECT * FROM Table1";
       cmd.Connection = conn;
       conn.Open();
       using (var reader = cmd.ExecuteReader())
       
           while (reader.Read())
           

               Console.WriteLine(reader.GetValue(3));
           
       
   

备注

如果 dll 出现问题: 转到 References 并单击 IBM.Data.DB2,在属性窗口中将 Copy Local 设置为 False。与 IBM.Data.DB2.Entity 相同。 (这将确保当您构建/编译项目时,这两个 dll 不会出现在 bin 文件夹中。相反,项目将使用 GAC 中的这些 DLL。我们仅使用它们来解析我们的代码) 另一件事是,可能是这些 dll 在初始安装时未在 GAC 中正确安装。因此,您可以尝试手动安装它们: 转到 Visual Studio 的开发人员命令提示符 并逐步运行这些行:
gacutil /i "C:\Program Files\IBM\IBM DATA SERVER DRIVER\bin\netf20\IBM.Data.DB2.dll"
gacutil /i "C:\Program Files\IBM\IBM DATA SERVER DRIVER\bin\netf20_32\IBM.Data.DB2.dll"
gacutil /i "C:\Program Files\IBM\IBM DATA SERVER DRIVER\bin\netf40\IBM.Data.DB2.dll"
gacutil /i "C:\Program Files\IBM\IBM DATA SERVER DRIVER\bin\netf40_32\IBM.Data.DB2.dll"
gacutil /i "C:\Program Files\IBM\IBM DATA SERVER DRIVER\bin\netf20\IBM.Data.Informix.dll"
gacutil /i "C:\Program Files\IBM\IBM DATA SERVER DRIVER\bin\netf20_32\IBM.Data.Informix.dll"
gacutil /i "C:\Program Files\IBM\IBM DATA SERVER DRIVER\bin\netf40\IBM.Data.Informix.dll"
gacutil /i "C:\Program Files\IBM\IBM DATA SERVER DRIVER\bin\netf40_32\IBM.Data.Informix.dll"
gacutil /i "C:\Program Files\IBM\IBM DATA SERVER DRIVER\bin\netf20\IBM.Data.DB2.Entity.dll"
gacutil /i "C:\Program Files\IBM\IBM DATA SERVER DRIVER\bin\netf20_32\IBM.Data.DB2.Entity.dll"
gacutil /i "C:\Program Files\IBM\IBM DATA SERVER DRIVER\bin\netf40\IBM.Data.DB2.Entity.dll"
gacutil /i "C:\Program Files\IBM\IBM DATA SERVER DRIVER\bin\netf40_32\IBM.Data.DB2.Entity.dll"
gacutil /i "C:\Program Files\IBM\IBM DATA SERVER DRIVER\bin\db2app.dll"
gacutil /i "C:\Program Files\IBM\IBM DATA SERVER DRIVER\bin\db2app64.dll"

cmd 你可以试试这个:

regsvr32 "C:\Program Files\IBM\IBM DATA SERVER DRIVER\bin\db2app64.dll"
regsvr32 "C:\Program Files\IBM\IBM DATA SERVER DRIVER\bin\db2app.dll"
此外,在执行所有这些操作之前,您需要确保您和您的供应商之间的连接是开放的(无论是什么,***、Site to Site *** 等)

【讨论】:

【参考方案5】:

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

【讨论】:

他特别说应用是AnyCPU,应用池允许32bits。 我的解决方案设置为任何 CPU,因此它应该在 x86 和 x64 中运行,对吗? 任何 CPU 意味着它将在 x86 或 x64 中运行,具体取决于数字因素;操作系统、IIS 模式等。我会尝试在显式 x86 模式下编译,以防启用 32 位应用程序由于某种未知原因无法正常工作。 @KrisG 也尝试过 x86。但没有运气【参考方案6】:

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

我发现解决此问题的最简单方法是使用构建后事件。

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

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

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

【讨论】:

【参考方案7】:

我遇到了同样的问题,并从以下链接获得了解决方案。当我删除本地副本并将副本到本地属性设置为 False 时,它​​起作用了。

A link to the solution

【讨论】:

以上是关于IBM DB2 问题--System.BadImageFormatException:无法加载文件或程序集 IBM.DB2.DLL 或其依赖项之一的主要内容,如果未能解决你的问题,请参考以下文章

未找到指定的 JDBC 驱动程序 com.ibm.db2.jcc.DB2Driver 类

缺少驱动程序类 com.ibm.db2.jcc.DB2Driver 的依赖关系

python操作db2和mysql ,ibm_db

原因:com.ibm.db2.jcc.am.SqlSyntaxErrorException:DB2 SQL 错误:SQLCODE=-440,SQLSTATE=42884

在 ibm db2 中创建数据库时出错

IBM DB2软件中如何修改数据库密码?