如何使用x86和x64版本管理PowerShell管理单元的开发

时间:2010-08-23 20:39:01

标签: powershell assemblies x86 64-bit processor-architecture

我目前正在编写一个PowerShell管理单元,它对特定于x64或x86的混合模式程序集(包含本机代码的程序集)具有特定的依赖关系。我有两个版本的依赖程序集,但我想知道如何最好地管理这个管理单元的构建和部署,具体来说:

  1. 是否需要两个版本的snapin,一个x86和一个x64,并使用两个不同版本的installutil来安装它,每个架构一次?
  2. 假设#1为真,是否建议在不同的“Program Files”和“Program Files(x86)”目录中安装两个不同版本的snapin?
  3. 为了构建两种不同的体系结构,构建一对共享除了单个引用之外的所有项目的理想(最简单的)方法是什么?
  4. 如果将snapin编译为“AnyCpu”,并且依赖dll都加载到GAC中,运行时是否会根据当前运行的PowerShell主机的体系结构从GAC加载正确的程序集?
  5. 是否有一种灵活的方式动态地,在运行时,选择要加载哪个从属dll(如果由于各种原因,它不能安装在GAC中)而不会遇到装配负载上下文的麻烦?

2 个答案:

答案 0 :(得分:4)

Mark,我们在PowerShell社区扩展中遇到了这种情况,它具有32位和64位版本的7zip.dll。您可以通过在snapin启动早期(或需要调用本机DLL之前)PInvoking到LoadLibrary来轻松解决此问题。然后,您可以测试您是32位还是64位进程(IntPtr.Size),然后使用LoadLibrary PInvoke手动加载正确的DLL。之后,DllImport(“YourNative.dll”)会注意到dll已经加载并使用该DLL。

看看这两个PSCX源代码文件: http://pscx.codeplex.com/SourceControl/changeset/view/74794?ProjectName=Pscx#1358100 http://pscx.codeplex.com/SourceControl/changeset/view/74794?ProjectName=Pscx#1358102

答案 1 :(得分:1)

我最终创建了一个模块(谢谢理查德!),但这并没有解决与处理器架构相关的问题。为了解决这个问题,我将两个版本的依赖dll放在模块目录中,并在每个cmdlet的构造函数中放入一些初始化代码(只运行一次)来加载相应版本的依赖dll。

非常感谢,指点。