【问题标题】:Unhandled exception of type System.TypeInitializationException occured in mscorlib.dllmscorlib.dll 中发生 System.TypeInitializationException 类型的未处理异常
【发布时间】:2015-12-30 19:14:18
【问题描述】:

我创建了这个主题,因为即使有很多类似的主题,我也找不到答案。

最近很多用户反映在 Visual Studio 中创建的工具停止工作。这是一个用 C# 编写的 WPF 应用程序,其目的是获取 Excel 电子表格并将其导出到 Oracle 数据库以进行进一步计算。

应用程序在尝试创建OracleBulkCopy 类时崩溃,该类是Oracle.DataAccess 库的成员(它作为参考添加到项目中)。该项目作为安装包分发给用户,其想法是他们不需要安装其他任何东西。

目前我正在 3 台机器上调查此问题:

  • 1 - 我的普通笔记本电脑
  • 2 - 在我的笔记本电脑上设置了虚拟机
  • 3 - 我同事送来的旧笔记本电脑

它仅在重新安装了 Windows 7 64 位和 Oracle Client 11g(Oracle.DataAccess 版本 2.112.2.0)的 3 号机器上运行良好。另外两个也在 Windows 7 64 位上运行,我们对各种 Oracle 库进行了测试。 1 号机器有点乱,因为我删除或重新安装了许多版本的 DataAccess,在 GAC 中它们都是可见的。我尝试以与 3 号机器相同的方式设置 2 号机器(虚拟机,也是全新的 Windows 7),但应用程序仍然崩溃。

这是错误消息和我浏览一些论坛和 StackOverflow 问题后的发现。

  1. 我发现了一些关于InnerException 的信息,我用try...catch 捕获了这些信息。说明如下:

内部异常

步入:跨过属性“System.Exception.get_InnerException”。要进入属性,请转到工具->选项->调试并取消选中“跳过属性和运算符(仅限托管)”。 步入:跨过属性“System.Exception.get_InnerException”。要进入属性,请转到工具->选项->调试并取消选中“跳过属性和运算符(仅限托管)”。 步入:跨过属性“System.TypeLoadException.get_Message”。要进入属性,请转到工具->选项->调试并取消选中“跳过属性和运算符(仅限托管)”。 步入:跨过属性“System.Console.get_Out”。要进入属性,请转到工具->选项->调试并取消选中“跳过属性和运算符(仅限托管)”。 在 Oracle.DataAccess.Client.OpsInit.CheckVersionCompatibility(字符串版本) 在 Oracle.DataAccess.Client.OracleInit.Initialize() 在 Oracle.DataAccess.Client.OracleConnection..cctor() 无法加载 DLL 'OraOps12.dll':找不到指定的模块。 (HRESULT 异常:0x8007007E)

OraOps11w(实际上是不同的版本)在安装Oracle 客户端的文件夹中可用。我检查了每台机器的 PATH 系统变量,它们清楚地指出了正确的路径。

  1. GAC 在 3 种情况下看起来不同。笔记本电脑 1 显示一团糟——正如我之前提到的多次重新安装的结果。笔记本电脑 3(运行良好的旧笔记本电脑)仅显示 1 个 Oracle.DataAcces 条目和 2 个策略记录。 2 号笔记本电脑也显示与 3 号笔记本电脑相同的库,但它不起作用。我想编辑 GAC 列表,但不幸的是,由于缺乏管理员权限,我无法手动或使用 Gacutil.exe 进行编辑。如果这可以解决问题,唯一的选择是使用正确的库安装包。

  2. 我还找到了一个教程,它建议卸载项目并编辑csproj。我更正了一些值,但这也没有带来预期的结果。

  3. 有一次讨论提到错误类可能有静态构造函数,但OracleBulkCopy 没有任何静态元素。

我已经没有办法解决这个问题了。你们中有人遇到过类似的问题并设法克服了这个问题吗?

【问题讨论】:

    标签: c# wpf oracle oracle11g odp.net


    【解决方案1】:

    实际的错误信息是这样的:

    无法加载 DLL 'OraOps12.dll':找不到指定的模块。

    我猜问题是没有正确安装 Oracle 客户端工具,或者错误的位 (32/64)。这是 ODP.NET 和 Oracle 客户端工具的一个非常常见的问题,有时很难诊断。

    在所有机器上安装相同版本的 ODP.NET 并为您的机器安装正确的位应该可以工作。

    【讨论】:

    • 您好,感谢您的快速回答。您确定 OracleBulkCopy 在最新的 Oracle.ManagedDataAccess 库中可用吗?我下载了 4.121.2,但最后看不到它。从我的角度来看,这个类似乎不支持 OracleBulkCopy。 banner.tbr.edu/E50529_01/ODPNT/intro004.htm
    • 对不起,我的错。我读到它已经可用了......仍然存在版本问题,所以在所有机器中安装相同版本的 ODP.NET 并为您的机器安装正确的位,它应该可以工作。
    • 我注意到一件有趣的事情。我在我的虚拟机上安装了 Visual Studio Enterprise(我认为它是以前的 Express 版本)并且解决方案有效。当我将它作为已安装的应用程序启动时,它不起作用。你有什么想法这两个应用程序之间可能有什么区别?
    • 位。 Visual Studio 是 32 位的。你的机器可能是 64 并且你的程序使用它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-18
    相关资源
    最近更新 更多