我有一个简单的.NET 7类库引用这个NuGet包(不包括其他ORACLE包):
<PackageReference Include="Oracle.ManagedDataAccess.Core" Version="3.21.100" />
然后我有一个用C#编写的PowerShell模块(也针对.NET 7)。它引用了上述项目。
<ProjectReference Include="..\Core\Core.csproj" />
PowerShell模块只有一个小程序Test-Oracle
。它从Core.dll调用一个方法。方法尝试连接到ORACLE并执行SELECT * FROM dual
。
在我的机器上工作得很好-它连接到ORACLE并输出数据。我的客户端,运行相同的代码,得到这个异常:
System.TypeLoadException: Could not load type 'System.Security.Principal.WindowsImpersonationContext' from assembly 'mscorlib, Version=4.0.0.0, Culture=neutral......
有什么办法解决吗?
编辑:
“核心”项目,实际查询到ORACLE,引用这些NuGet包:
<PackageReference Include="Oracle.ManagedDataAccess.Core" Version="3.21.100" />
<PackageReference Include="Serilog" Version="3.0.1" />
<PackageReference Include="serilog.sinks.console" Version="4.1.0" />
<PackageReference Include="serilog.sinks.file" Version="5.0.0" />
PowerShell模块项目包括:
<ItemGroup>
<PackageReference Include="PowerShellStandard.Library" Version="5.1.0-preview-06">
<PrivateAssets>All</PrivateAssets>
</PackageReference>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Core\Core.csproj" />
</ItemGroup>
1条答案
按热度按时间mbjcgjjk1#
前言:
ResolveEventArgs.RequestingAssembly
属性包含 * 请求 * 加载的程序集。我可能没有完整的图片,但我的理解是这样的:
您使用的是
PowerShellStandard.Library
NuGet package,这意味着您的PowerShell模块(小工具)* 也可以在Windows PowerShell* 中运行,而不仅仅是在PowerShell (Core) 7+中。System.Security.Principal.WindowsImpersonationContext
类型-请参阅this GitHub issue了解背景。但是,为了创建一个可以在 * 常规PowerShell会话 * 中使用的PowerShell模块,(而不是创建一个本身托管PowerShell的应用程序),你 * 必须 * 使用
PowerShellStandard.Library
包-但是我知道 * 没有 * 内置的方法来 * 限制模块只能在一个版本或另一个版本中运行 *(GitHub issue #5541的主题是在未来提供更好的目标定位)。因此,如果你想强制你的模块只能在PowerShell(Core)中使用,你必须自己实现:[1]
这里有一个概念验证,使用ad编译的C#代码来简化:
Get-Foo
。PlatformNotSupportedException
异常。[1]注意:尽管PowerShell module manifests有一个
CompatiblePSEditions
条目来声明版本兼容性,但它似乎具有纯粹的 * 信息 * 字符,并且 * 不强制执行 *,最高可达PowerShell(Core)7.3.7(撰写本文时的当前版本)。目前,在尝试导入 Windows PowerShell 的 * 系统模块 * 时,该条目 * 仅 * 受到尊重,即这些存储在$env:windir\System32\WindowsPowerShell\v1.0\Modules
中,在 PowerShell(核心) 中。