Oracle DataAccess相关:"动态程序集不支持调用的成员。"

时间:2016-06-17 20:24:25

标签: c# .net oracle dll gac

我知道在SO上多次讨论过这样的错误。有些人认为这是DLL文件中的一个错误,有些通过更改DLL版本来解决,其他似乎没有线索。无论如何,我只是发帖试试运气:

在C#GUI的网格中选择行时,我的应用程序崩溃了。 stackTrace看起来像:

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()

我的同事没有遇到这个问题所以我认为它与我的本地机器有关。

我在GAC中查找了Oracle.DataAccess.dll,它看起来像(我使用.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,我花了一些时间才弄清楚正确的(至少到那个时候)Oracle DLL在VS2015下构建和运行的应用程序。 / p>

最近的帖子在这里:Passing Oracle UDT to stored procedure throws error on ExecuteNonQuery但它没有解决方案。

1 个答案:

答案 0 :(得分:0)

如果有人还有这个问题。当我尝试将Oracle驱动程序从11. *升级到12。*。

时,我发生了同样的事情

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

快速解决方案只是将运行时程序集重定向到4.12 *,因为我们的应用程序目标位于.Net Framework 4。*。 我首选的解决方案是迁移到使用Managed Oracle Driver NuGet版本。

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