我正在尝试使用 Powershell 和 Oracle.ManagedDatabaseAccess.dll 连接到现有的 oracle 数据库。我使用相同的库在 C# 中运行代码。程序集已加载,但我无法使用它。
我正在使用 Win10 和 Powershell ISE。我还使用 VS2017/15.3.2 和 .Net 4.7.02046。
我尝试使用根本不起作用的“Add-Type -AssemblyName”和“Add-Type -Path”。两个选项都立即显示错误。
我可以打电话
[Reflection.Assembly]::LoadFile("myrootpath\.nuget\packages\oracle.manageddataaccess.core\2.18.5\lib\netstandard2.0\Oracle.ManagedDataAccess.dll")
但我得到了:
GAC Version Location
--- ------- --------
False v4.0.30319 C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\Oracle.ManagedDataAccess\v4.0_2.0.18.3__89b483f429c47342\Oracle.ManagedDataAccess.dll
我使用 gcautil 手动将程序集添加到 GAC。现在我明白了
GAC Version Location
--- ------- --------
True v4.0.30319 C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\Oracle.ManagedDataAccess\v4.0_2.0.18.3__89b483f429c47342\Oracle.ManagedDataAccess.dll
现在当我打电话时:
$command = New-Object Oracle.DataAccess.Client.OracleCommand($sql,$conn)
我收到以下错误:
New-Object : The Type [Oracle.ManagedDataAccess.Client.OracleConnection] cannot be found. Make sure that you load the Assembly that contains this Type.
In Line:2 Character:8
+ $conn= New-Object Oracle.ManagedDataAccess.Client.OracleConnection($c ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidType: (:) [New-Object], PSArgumentException
+ FullyQualifiedErrorId : TypeNotFound,Microsoft.PowerShell.Commands.NewObjectCommand
我阅读了有关编译小型 C# 控制台应用程序(因为它有效)并从 powershell 调用它的解决方案。这可能是可行的,但是我真的很想了解这里的问题。任何帮助是极大的赞赏。
更新/编辑:
PS H:\> Add-Type -Path "C:\mypath\Oracle.ManagedDataAccess.dll"
Add-Type : At least one type in the assembly could not be loaded.
+ CategoryInfo : NotSpecified: (:) [Add-Type], ReflectionTypeLoadException
+ FullyQualifiedErrorId : System.Reflection.ReflectionTypeLoadException,Microsoft.PowerShell.Commands.AddTypeCommand
PS H:\> $error[0].Exception.LoaderExceptions[0]
The type "System.IO.Stream" in the assembly "netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51" could not be loaded.
Netstandard2.0.0.0 是 Oracle.ManagedDataAccess.dll 的要求,它也必须安装在我的 VS 项目中。
System.IO.Stream 应该在 PS 中可用而无需加载。可能是版本冲突,因为我的主要开发环境是 .Net 4.7.02046?