C# 调用静态方法-Powershell时使用特定类型/程序集

C# 调用静态方法-Powershell时使用特定类型/程序集,c#,powershell,ssas-tabular,C#,Powershell,Ssas Tabular,我使用的是静态方法: [Microsoft.AnalysisServices.Tabular.JsonSerializer]::DeserializeDatabase($filePath) 通过几年来对这段代码的支持,我学会了加载显式程序集,比如: 因为sqlserverPowerShell模块包含自己版本的程序集,这些程序集与我们运行的SSAS版本不兼容,所以我们进入了模块的“localapp”版本和我显式加载到GAC中的版本之间的dll地狱 具体来说,sqlserver模块正在加载Micr

我使用的是静态方法:

[Microsoft.AnalysisServices.Tabular.JsonSerializer]::DeserializeDatabase($filePath)
通过几年来对这段代码的支持,我学会了加载显式程序集,比如:

因为
sqlserver
PowerShell模块包含自己版本的程序集,这些程序集与我们运行的SSAS版本不兼容,所以我们进入了模块的“localapp”版本和我显式加载到GAC中的版本之间的dll地狱

具体来说,
sqlserver
模块正在加载
Microsoft.AnalysisServices,Version=Version=18.2.2.0
,并且由于它没有与所有TOM程序集捆绑在一起,因此希望GAC中存在相同版本的
Microsoft.AnalysisServices.Tabular.Json
(它没有)。我可以通过查找所需程序集的v18版本并将其安装到GAC(尽管我发现较新版本与我正在运行的SSAS版本不兼容)或从
sqlserver
模块中删除程序集,从而仅使用我在GAC中安装的程序集来解决此问题

我的问题是,当我调用静态方法时,从a中,是否有类似的方式来说明我希望用于此特定方法调用的特定程序集/加载类型版本/令牌,与我使用带有完全限定名的
新对象
时的方式类似,以便明确告诉Powershell要使用哪个程序集/类型,以便它不会尝试加载较新的程序集/类型版本?

好消息! 具体类型是否标记为
static
无关紧要-类型文字语法保持不变,因此您应该能够在正确的程序集中使用以下方法解析该方法:

[Microsoft.AnalysisServices.Tabular.JsonSerializer, Microsoft.AnalysisServices.Tabular, Version=14.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91]::DeserializeDatabase($filePath)
或:


额外小费! 由于程序集限定的类型名称在阅读代码时可能会变得很长且分散注意力,因此您可能希望将所需的类型引用存储在一个或多个变量中:

# Create hashtable
$ASTabularV14 = @{}

# Use existing public type to obtain assembly reference and populate our hashtable
$type = [Microsoft.AnalysisServices.Tabular.JsonSerializer, Microsoft.AnalysisServices.Tabular, Version=14.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91]
$publicTabularTypes = $type.Assembly.GetTypes().Where({
  $_.IsPublic -and -not $_.IsAbstract -and $_.Namespace -eq 'Microsoft.AnalysisServices.Tabular'
}).ForEach({ $ASTabularV14[$_.Name] = $_ })
现在我们有了自己的小“类固醇类型加速器”,我们可以在以后的脚本中重用它:

# ... later on in your script

$deserializedDatabase = $ASTabularV14['Serializer']::DeserializeDatabase($dbData)
$resultOfSomeServerOperation = $ASTabularV14['Server']::DoStuff()

是否
[Microsoft.AnalysisServices.Tabular.JsonSerializer,Microsoft.AnalysisServices.Tabular,Version=14.0.0.0,Culture=neutral,PublicKeyToken=89845dcd8080cc91]::反序列化数据库($filePath)
不工作?目标类型是否标记为静态,没有区别。也许我误解了你的问题?@MathiasR.Jessen,谢谢你的评论/我编辑了这个问题,试图让它更清楚,然后我用
[Microsoft.AnalysisServices.Tabular.JsonSerializer,Microsoft.AnalysisServices.Tabular,Version=14.0.0.0,Culture=neutral,PublicKeyToken=89845dcd80cc91]::反序列化数据库()
正是我想要的!如果你把它打出来作为答案,我会很高兴地把它标记为接受。
# Create hashtable
$ASTabularV14 = @{}

# Use existing public type to obtain assembly reference and populate our hashtable
$type = [Microsoft.AnalysisServices.Tabular.JsonSerializer, Microsoft.AnalysisServices.Tabular, Version=14.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91]
$publicTabularTypes = $type.Assembly.GetTypes().Where({
  $_.IsPublic -and -not $_.IsAbstract -and $_.Namespace -eq 'Microsoft.AnalysisServices.Tabular'
}).ForEach({ $ASTabularV14[$_.Name] = $_ })
# ... later on in your script

$deserializedDatabase = $ASTabularV14['Serializer']::DeserializeDatabase($dbData)
$resultOfSomeServerOperation = $ASTabularV14['Server']::DoStuff()