2

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

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

2 回答 2

4

马克,我们在使用 32 位和 64 位版本的 7zip.dll 的 PowerShell 社区扩展中遇到了这种情况。您可以在管理单元启动的早期(或在需要调用本机 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

于 2010-08-23T21:08:07.747 回答
1

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

谢谢大家的指点。

于 2010-08-24T14:59:28.910 回答