我在c#中编写了一个管理单元。
我尝试使用installutil进行安装,但最初没有用。我注意到在msdn页面上他们说运行mmcperf将management.dll安装到GAC中。
这样做,我能够安装我的快照并运行它。我有一台xp机器。
我的问题是如何在客户机器上部署自定义管理单元... 我需要考虑哪些事情? (操作系统?,.net框架,是否安装了mmc 3.0等?)
我可以在安装快照时运行mmcperf吗?这是一个好方法吗?
答案 0 :(得分:8)
您的问题可能有所不同,但我曾在64位计算机上遇到过类似的问题,并发现了以下情况。如果您的问题与32/64位无关,我无法说出问题所在,我为您花时间道歉。
您应该可以使用InstallUtil安装管理单元。但请注意,InstallUtil上有两个单独的版本:x86二进制文件的一个(默认)和x64二进制文件的一个版本。
即使您为 Any CPU 编译C#代码,使用标准InstallUtil也只会将MMC管理单元注册为32位管理单元。如果您在64位操作系统上运行,请尝试将MMC作为32位进程(MMC /32
IIRC)启动,并查看您的管理单元是否在那里不可用。
要将管理单元注册为64位管理单元,必须使用64位版本的InstallUtil(通常位于C:\ Windows \ Microsoft.NET \ Framework64 \ v2.0.50727中)。
要注册两个版本的管理单元,必须将其注册两次。
答案 1 :(得分:3)
加入Mark Seemann的回应:
您还可以直接检查MMC注册表项,以验证您的管理单元是在64位注册表项中注册,还是32位重定向注册表(显示在 Wow6432Node 下的注册表项) :
如果您的条目仅在HKLM \ Software \ Wow6432Node下,那么您已经注册了32位管理单元,Mark关于运行“MMC / 32”的建议应该使它们可见。 这不是世界末日:如果你将MMC会话保存为snapin快捷方式,我认为它在运行时会打开32位版本的MMC。
如果你真的想要64位管理单元注册(为什么不注册?),MSDN在MMC 64-Bit Versus 32-Bit Considerations上有一个页面,其中包含更多细节,包括调用哪些InstallUtil路径以获得64-和32位注册表项。
但请注意,某些MSI打包应用程序实际上在MSI本身中包含一个InstallUtil.exe副本作为二进制文件,而不是在目标计算机上调用它。 (您可以通过使用Orca查看MSI二进制表和自定义操作来检查是否发生这种情况。)如果仅包含32位InstallUtil,则会将您的注册放在错误的位置(Wow6432Node),这很难祝你好运。
据我所知,Windows Installer“正确方式”( TM )根本不使用InstallUtil(我认为主要是由于运行托管MSI自定义操作所涉及的问题?)。在任何情况下,如果您避免使用InstallUtil,则可以通过在MSI中显式创建注册表项来完全注册您的管理单元,从而使Windows Installer能够控制创建和删除它们。
或者,您可以执行自定义操作以调用目标计算机的Framework64文件夹下的InstallUtil.exe。这将得到正确的snapin注册位置,但是你必须处理自定义操作在运行时弹出CMD shell窗口的事实,如果这困扰你。不确定您的MSI创作工具是否具有等效功能,但在WiX中有Quiet Execution Custom Action。 (我想如果你没有使用WiX,你仍然可以包括WixUtilExtension.dll并在适当地设置QtExec64CmdLine属性之后调用“CAQuietExec64”...但是如果你在MSI创作的那个级别上工作你可能会更好只是为了切换和使用WiX:)