我试图使用Powershell和Oracle.ManagedDatabaseAccess.dll连接到现有的Oracle数据库。我使用相同的库在C#中运行代码。程序集已加载,但我无法使用它。
我用的是Win10和Powershell伊势,我也用VS 2017/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?
2条答案
按热度按时间ryhaxcpt1#
首先,您需要确保您使用的NuGet程序集版本与您使用的PowerShell版本兼容。您提到您在PowerShell伊势中编写Windows 10上的代码。由于PowerShell ISE不支持PowerShell Core,并且Windows 10周年纪念版包含5.1 out of the box,因此我假设您正在Windows PowerShell中编写代码,而不是较新的PowerShell Core。
这一点很重要,因为在Windows PowerShell 5.1之前,PowerShell是基于.NET Framework的,而在PowerShell Core中,Microsoft切换到了多平台的.NET Core。而且,*Oracle为每个版本发布了不同版本的Oracle数据提供程序 *。
使用.NET Framework(Windows PowerShell 5.1及更低版本)时,请使用Oracle.ManagedDataAccess
使用.NET Core(PowerShell Core 6及更高版本)时,请使用Oracle.ManagedDataAccess.Core
其次,您需要将程序集导入到当前会话中。虽然这听起来很容易,但Oracle有一个绝妙的想法,即对Core和非Core版本(托管和非托管)使用相同的程序集名称,因此您需要使用完整的程序集路径来执行此操作。否则很可能会不可靠地导入不兼容的版本。
幸运的是,您可以将查找程序集和下载程序集(如果缺少)结合起来,仅使用在用户空间中运行的本机PowerShell命令进行快速操作。
1.使用
Get-Package
检查是否已经安装了ODP.NET并获取其位置。1.如果返回
ObjectNotFound
异常,请使用Install-Package
从www.example.com下载ODP.NETNuGet.org。1.如果返回
ObjectNotFound
异常,请将www.example.com安装NuGet.org为不受信任的PackageProvider。1.通过
Add-Type
和程序集路径显式导入新安装的程序集。然后您就可以在PowerShell中使用ODP.NET了。
示例实现
示例输出
可以通过以下方式轻松修改此代码以在PowerShell Core中工作:
1.将
#Requires -PSEdition Desktop
替换为#Requires -PSEdition Core
1.将安装组件从
Oracle.ManagedDataAccess
更改为Oracle.ManagedDataAccess.Core
1.将
Get-Package
和Install-Package
的-MinimumVersion
参数值从"19.3.1"
更改为"2.18.3"
。pgpifvop2#
我将文件'Oracle.ManagedDataAccess.dll'复制到带有ps1脚本(未安装Oracle客户端)的文件夹中,并使用代码: