我得到了winsvr2008r2 x64,我已经对此进行了以下观察:
如果我手动创建COM +应用程序并通过组件服务GUI手动安装所有组件,则所有内容都以64位运行。
但如果我使用代码(System.EnterpriseServices.RegistrationHelper.InstallAssembly
)安装所有内容,则COM +组件将以32位运行。
使用InstallAssembly
时是否可以将所有内容都以64位运行?
答案 0 :(得分:1)
我不知道它是否是一个bug,但这可能与“Bitness”COM +组件属性有关:Components Collection
如文档中所述,“位数”可以设置为1(32位)或2(64位)。您可以使用这种C#代码读取给定组件的Bitness值:
COMAdminCatalog catalog = new COMAdminCatalogClass();
ICatalogCollection appCollection = (ICatalogCollection)catalog.GetCollection("Applications");
appCollection.Populate();
// browse all apps
foreach (COMAdminCatalogObject app in appCollection)
{
Console.WriteLine("application=" + app.Name);
// browse all components
ICatalogCollection compCollection = (ICatalogCollection)appCollection.GetCollection("Components", app.Key);
compCollection.Populate();
foreach (COMAdminCatalogObject comp in compCollection)
{
Console.WriteLine(" component=" + comp.Name);
Console.WriteLine(" bitness=" + comp.get_Value("Bitness"));
}
}
不幸的是,Bitness是一个ReadOnly属性。根据我的理解,底层的COM注册过程使用实际进行注册的过程的位数来确定如何设置此属性。
这篇文章在本文中有明确解释:Serviced Components in 32-bit and 64-bit Architectures
如表中所示,64位或32位注册取决于您使用的工具的版本。这就是为什么像Regsvcs.exe这样的工具有两种形式:32位和64位以及组件的注册方式只取决于此。另外,如果COM +应用程序是空的,请注意事实可能会有所不同。
我想这意味着你的运行.EXE应该用64位编译。
答案 1 :(得分:0)
当你在内部调用InstallAssembly
时,会调用一个方法ValidateBitness
,它会检查程序集是否已经安装了错误的位数,在这种情况下它报告错误并失败{{1 }}。它根据对RegistrationException
的调用结果确定“正确”位数是什么。
进一步看,似乎有一种注册64位和32的方法。这似乎是正确的,因为注册取决于正在运行的应用程序(调用IsWow64Process
)的位数。你能否确认这确实是64位运行?
您可能遇到了一个标记为“不会很快修复”的报告错误。我无法判断此错误是否完全适用于您的方案,因为我不确定安装程序是否在内部调用相同的API函数。请参阅this post on Microsoft Connect on register keys being stored in the wrong hive。