当在Visual Studio中加载相同的dll时,如何处理在PowerShell中尝试添加类型时未找到的引用?

时间:2016-09-01 08:44:15

标签: .net visual-studio powershell informix

我正在尝试从PowerShell引用IBM.Data.DB2和IBM.Data.Informix库。

我有一些Visual Studio测试代码,我只是添加了对这些dll的引用并开始编码,一切都很顺利。

尝试在PowerShell中添加相同的引用时,请尝试以下操作:

try{
$DataType4 = Add-Type -Path "C:\Program Files\IBM\SQLLIB\BIN\netf40\IBM.Data.DB2.dll"
}
catch
{
$_.Exception | Format-List * -force
}

当试图运行这个时,我得到一个扩展的错误列表,抱怨找不到Microsoft.ReportingServices(我认为它还没有安装在这台机器上;我打印出我的GAC并且它没有出现虽然有许多引用Microsoft.ReportViewer;但成功的Visual Studio项目在其引用中不包含Microsoft.ReportingServices。从外观上看,LoaderException多次包含此信息,因此我只包含一个副本:

Types        : {IBM.Data.DB2.CS_FitHighPrecisionType, IBM.Data.DB2.LLIST, IBM.Data.DB2.LISTLOCK, IBM.Data.DB2.ADP...}
LoaderExceptions : {System.IO.FileNotFoundException: Could not load file or assembly 'Microsoft.ReportingServices.Interfaces, Version=10.0.0.0, Culture=neutral, 
               PublicKeyToken=89845dcd8080cc91' or one of its dependencies. The system cannot find the file specified.
               File name: 'Microsoft.ReportingServices.Interfaces, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91'

               WRN: Assembly binding logging is turned OFF.
               To enable assembly bind failure logging, set the registry value [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD) to 1.
               Note: There is some performance penalty associated with assembly bind failure logging.
StackTrace   :    at System.Reflection.RuntimeModule.GetTypes(RuntimeModule module)
                  at System.Reflection.Assembly.GetTypes()
                  at Microsoft.PowerShell.Commands.AddTypeCommand.LoadAssemblyFromPathOrName(List`1 generatedTypes)
                  at Microsoft.PowerShell.Commands.AddTypeCommand.EndProcessing()
                  at System.Management.Automation.CommandProcessorBase.Complete()

任何人都可以解释为什么这似乎在Visual Studio中运行良好,但在PowerShell中却没有?我是否正确检索了异常?有没有办法解决缺少的Microsoft组件,看到Visual Studio在没有它的情况下处理好了吗?

我觉得我做的事情显然是错误的,并且在风车上倾斜,但我似乎无法找到任何其他提及这个问题。

编辑:这是我的小测试项目及其参考资料的屏幕截图。它只是获取一个数据表并将其转储到DataGridView中,但它显示了使用这些驱动程序连接连接所需的最少编码量。

1 个答案:

答案 0 :(得分:0)

周末重启后,我修改了我的回答:

事实证明,在加载过程中抛出的异常是非致命的,因此捕获它们并忽略它们对于测试代码来说效果很好。 如果Add-Type以更严肃的方式失败,我会在整个执行块周围再次尝试捕获,并且实际上尝试访问"真正的"加载失败会引发一个异常情况。

为了未来的搜索者的利益而包含的测试代码:

try{
$DataType7 = Add-Type -Path "C:\Program Files\IBM\SQLLIB\BIN\netf40\IBM.Data.Informix.dll"
}
catch
{
    #Throw a horrendous mass of exceptions, which we ignore, but output.
    $_.Exception | Format-List * -force
}


$ifxCStr = New-Object -TypeName IBM.Data.Informix.IfxConnectionStringBuilder
$ifxCStr.Server = "x"
$ifxCStr.Database = "x"
$ifxCStr.UserID = "x"
$ifxCStr.Password = "x"

$ifxConn = New-Object -TypeName IBM.Data.Informix.IfxConnection($ifxCStr.ConnectionString)
$ifxConn.Open()


$ifxCommand = $ifxConn.CreateCommand()
$ifxCommand.CommandText = "SELECT FIRST 100 * FROM tbl_x"

$ifxReader = $ifxCommand.ExecuteReader()

$ifxTable = New-Object System.Data.DataTable
$ifxTable.Load($ifxReader)
$ifxTable | Out-GridView

$ifxConn.Close()