相关疑难解决方法(0)

Powershell - 在应用程序配置文件中找不到程序集绑定重定向

这里有问题......

我有一个Powershell CmdLet,它在32位模式下运行时运行,在64位模式下运行失败.问题是原因是什么以及如何解决.

情况

Powershell CmdLet引用'OutlookHelper.Common.dll'.最新版本是2.0.0.0 CmdLet还使用日志记录和引用'Logging.dll'.
Logging.dll也引用'OutlookHelper.Common.dll',仅针对版本1.0.0.0进行编译.

我如何使它工作,这部分工作

在Powershell的应用程序配置文件中使用程序集绑定重定向:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <startup useLegacyV2RuntimeActivationPolicy="true"> 
    <supportedRuntime version="v4.0.30319"/> 
    <supportedRuntime version="v2.0.50727"/> 
  </startup> 
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="OutlookHelper.Common" publicKeyToken="5e4553dc0df45306"/>
        <bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0"/>
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>
Run Code Online (Sandbox Code Playgroud)

Powershell 32位工作得很好

在64位计算机上运行时,使用"Windows Powershell(x86)"可以正常运行.程序集管理器找到程序集绑定重定向:

The operation was successful.
Bind result: hr = 0x0. The operation completed successfully.

Assembly manager loaded from:  C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll
Running under executable  C:\Windows\syswow64\Windowspowershell\v1.0\powershell.exe
--- A detailed error log follows. 

=== Pre-bind state information ===
LOG: User = MYDOMAIN\testuser
LOG: DisplayName = …
Run Code Online (Sandbox Code Playgroud)

.net powershell 32bit-64bit assembly-binding-redirect

11
推荐指数
3
解决办法
5184
查看次数

在类库中的哪里处理 AssemblyResolve 事件?

我需要动态解析从一个类库到另一个类库的程序集引用。类库是从 PowerShell 脚本加载的,因此在可执行文件中查找依赖程序集的默认 .NET 行为会直接失败,因为可执行文件就是 PowerShell 本身。如何使这些依赖程序集引用正确解析/工作?

更详细地说

我有两个实用程序库:一个是核心库,另一个是执行一些非常具体的解析任务的库。我想在 PowerShell 脚本中动态加载它们,而不将它们安装在 GAC 中。第二个库依赖于第一个库。在VS解决方案中,解析库有一个对核心库的项目引用,带有Copy Local= true

使用后,我可以从解析库输出 bin (/Debug|/Release) 文件夹加载和使用这两个库(此处为 PowerShell):

[Reflection.Assembly]::LoadFile("C:\...thefile.dll")
Run Code Online (Sandbox Code Playgroud)

但是,每当调用解析(依赖)库中的方法来调用核心库中的某些内容时,它都无法解析核心程序集。这……令人沮丧……因为这些文件位于同一文件夹中。其中一个或两个都具有强名称键并没有什么区别。

我现在的解决方法是处理该AssemblyResolve事件。棘手的事情是弄清楚将其放在类库中的何处,因为没有像可执行方法中那样始终在其他任何内容之前执行的单一入口点Main()(请参阅Is there an equivalent of a application_Start for a class library in c#) 。

现在,我已经创建了一个Resolver带有静态构造函数的静态类AssemblyResolve,该静态构造函数附加了 的处理程序,然后在每个解析类中都有一个引用静态解析器类的静态构造函数,强制执行解析器类的静态构造函数。结果是,AssemblyResolve 事件仅附加一次并使用通用的中央代码进行处理。所以它有效。但我讨厌必须向我的所有解析类添加一个时髦的静态构造函数。

有更好的方法来处理这个问题吗?

c# dll assemblies

5
推荐指数
1
解决办法
5701
查看次数