【问题标题】:Oracle DataAccess related: "The invoked member is not supported in a dynamic assembly."Oracle DataAccess 相关:“动态程序集中不支持调用的成员。”
【发布时间】:2016-06-17 20:24:24
【问题描述】:

据我所知,这样的错误已在SO讨论多次。一些原来那是在DLL文件中的错误,一些通过改变DLL版本解决了,其他似乎没有任何线索。无论如何,我只是张贴试试我的运气: P>

在上一个C#GUI网格选择行当我的应用程序崩溃。栈跟踪看起来像:

System.NotSupportedException: The invoked member is not supported in a dynamic assembly.
at Oracle.DataAccess.Types.OracleUdt.GetAllReferencedAssemblies()
at Oracle.DataAccess.Client.RegAndConfigRdr.setudtmapping(Hashtable& s_mapUdtNameToMappingObj)
at System.Reflection.Emit.InternalAssemblyBuilder.get_Location()
at Oracle.DataAccess.Types.OracleUdt.SetCustomTypeMappings()
at Oracle.DataAccess.Types.OracleUdt.GetUdtName(String customTypeName, String dataSource)
at Oracle.DataAccess.Client.OracleParameter.SetUDTFromCustomObject(OracleConnection conn, IOracleCustomType customObj, Int32 i)
at Oracle.DataAccess.Client.OracleParameter.PreBind_OracleObject(OracleConnection conn)
at Oracle.DataAccess.Client.OracleParameter.PreBind_Object(OracleConnection conn)
at Oracle.DataAccess.Client.OracleParameter.PreBind(OracleConnection conn, IntPtr errCtx, Int32 arraySize)
at Oracle.DataAccess.Client.OracleCommand.ExecuteReader(Boolean requery, Boolean fillRequest, CommandBehavior behavior)
at Oracle.DataAccess.Client.OracleCommand.ExecuteReader()

我的同事没有遇到这个问题,所以我想它是与我的本地机器。 P>

我抬头的Oracle.DataAccess.dll在GAC,它看起来像(I所使用的.NET 4.0,在C:/windows/Microsoft.NET/assembly):

find . -name "Oracle.*DataAccess*.dll"
./GAC_32/Oracle.DataAccess/v4.0_4.121.2.0__89b483f429c47342/Oracle.DataAccess.dll
./GAC_MSIL/Oracle.ManagedDataAccess/v4.0_4.121.2.0__89b483f429c47342/Oracle.ManagedDataAccess.dll

我的同事使用:V2.121.3.0 并且没有托管 dll。为什么我的DLL是从他们不同的原因是,我使用VS2015与他们VS2013,我花了一段时间才能找出正确的(至少由时间)获得建造和运行VS2015下应用甲骨文的DLL。

在最近的职位是在这里:Passing Oracle UDT to stored procedure throws error on ExecuteNonQuery但是它没有一个解决方案 P>

【问题讨论】:

  • 能否请您告诉我们您的代码吗? SPAN>
  • 您可以在Visual Studio中的任何版本同时使用V2.121.3.0和V4.121.2.0。然而,安装的版本必须匹配.NET目标的编译器设置,即必须目标版本设置为3.0或更高版本为4.xxx。为了使用版本2.xxx编译器对象的版本必须是2.0(或降低其不再可用)跨度>
  • @ Wernfried Domscheit,对不起,我只能运行&测试应用程序二进制 - 我没有源。 :-(
  • 然后交谈谁提供的二进制跨度>的人
  • @ AardVark71我认为,我们选择使用非托管客户端需要SDO_GEOMETRY时。我们没有选择黯然。 :(

标签: c# .net oracle dll gac


【解决方案1】:

如果有人仍然有这个问题。当我尝试将 Oracle 驱动程序从 11.* 升级到 12.* 时,同样的事情发生在我身上。

我发现在运行时,它会从 GAC 加载 2.12* 和 4.12* Oracle.DataAccess 程序集。

快速解决方案是简单地将运行时程序集重定向到 4.12*,因为我们的应用程序目标是 .Net Framework 4.*。 我首选的解决方案是迁移到使用托管 Oracle 驱动程序 NuGet 版本。

我仍然没有弄清楚为什么它会抛出异常,即使他们在 dll 中检查了 (!assembly.IsDynamic ),正如@AardVark71 提到的那样。但是“assembly.Location”这一行是在 12.* Oracle Driver 中引入的。也不太清楚为什么它加载了两个版本的 Oracle.DataAccess 程序集

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    • 2011-01-20
    相关资源
    最近更新 更多