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,执行:
> testconn40 DBDSNSAMPLE
此命令不会让您登录(因为我们没有在 .cfg 文件中指定用户凭据),但至少它会显示正确的消息,这意味着您的 .NET应用程序将工作。否则会显示一些异常错误。
Visual Studio 中的 DB2
从 nuget 安装 IBM.Data.DB2 包。 然后,在 References 中,您将看到 IBM.Data.DB2.dll 和 IBM.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 的依赖关系
原因:com.ibm.db2.jcc.am.SqlSyntaxErrorException:DB2 SQL 错误:SQLCODE=-440,SQLSTATE=42884