.net RegistrationHelper.InstallAssembly和64位

.net RegistrationHelper.InstallAssembly和64位,.net,32bit-64bit,com+,.net,32bit 64bit,Com+,我得到了一个winsvr2008r2 x64,我对它进行了以下观察: 如果我手动创建COM+应用程序,并通过组件服务GUI手动安装所有组件,则所有组件都以64位运行 但是如果我使用代码(System.enterpriseseservices.RegistrationHelper.InstallAssembly)安装所有组件,COM+组件将以32位运行 使用InstallAssembly时,是否可以使所有内容都以64位运行 当您在内部调用InstallAssembly时,将调用一个方法Valida

我得到了一个winsvr2008r2 x64,我对它进行了以下观察:

如果我手动创建COM+应用程序,并通过组件服务GUI手动安装所有组件,则所有组件都以64位运行

但是如果我使用代码(
System.enterpriseseservices.RegistrationHelper.InstallAssembly
)安装所有组件,COM+组件将以32位运行


使用
InstallAssembly
时,是否可以使所有内容都以64位运行

当您在内部调用
InstallAssembly
时,将调用一个方法
ValidateBitness
,该方法检查程序集是否已使用错误的位安装,在这种情况下,它会报告错误并以
RegistrationException
失败。它根据调用
IsWow64Process
的结果确定“正确”比特数

进一步看,似乎有一种方法可以注册64位和32位。这似乎是正确的,因为注册取决于正在运行的应用程序(调用
InstallAssembly
的应用程序)的位数。您能确认它确实以64位运行吗


您可能遇到了一个标记为“不会很快修复”的报告错误。我无法判断这个bug是否完全适用于您的场景,因为我不确定安装程序是否在内部调用相同的API函数。请参阅。

当您在内部调用
InstallAssembly
时,将调用一个方法
ValidateBitness
,该方法检查程序集是否已使用错误的位安装,在这种情况下,它会报告一个错误并以
RegistrationException
失败。它根据调用
IsWow64Process
的结果确定“正确”比特数

进一步看,似乎有一种方法可以注册64位和32位。这似乎是正确的,因为注册取决于正在运行的应用程序(调用
InstallAssembly
的应用程序)的位数。您能确认它确实以64位运行吗


您可能遇到了一个标记为“不会很快修复”的报告错误。我无法判断这个bug是否完全适用于您的场景,因为我不确定安装程序是否在内部调用相同的API函数。请参阅。

我不知道这是否是错误,但这可能与“Bitness”COM+组件属性有关:

如文档中所述,“比特数”可以设置为1(32位)或2(64位)。您可以使用这种C代码读取给定组件的位值:

不幸的是,比特率是一个只读属性。据我所知,底层COM注册进程使用实际执行注册的进程的比特数来确定如何设置此属性

本文对此进行了含蓄的解释:

如表中所示,64位或32位注册取决于所使用工具的版本。这就是为什么像Regsvcs.exe这样的工具有两种风格:32位和64位,而组件的注册方式仅仅取决于此。另外,请注意,如果COM+应用程序为空或不为空,情况可能会有所不同


我想这意味着你正在运行的.EXE应该以64位编译。

我不知道这是否是一个bug,但这可能与“Bitness”COM+组件属性有关:

如文档中所述,“比特数”可以设置为1(32位)或2(64位)。您可以使用这种C代码读取给定组件的位值:

不幸的是,比特率是一个只读属性。据我所知,底层COM注册进程使用实际执行注册的进程的比特数来确定如何设置此属性

本文对此进行了含蓄的解释:

如表中所示,64位或32位注册取决于所使用工具的版本。这就是为什么像Regsvcs.exe这样的工具有两种风格:32位和64位,而组件的注册方式仅仅取决于此。另外,请注意,如果COM+应用程序为空或不为空,情况可能会有所不同


我想这意味着您正在运行的.EXE应该以64位编译。

这没有意义,InstallAssembly直接写入注册表项。确保您的项目没有将目标平台设置为x86。这是VS2010的默认设置。不,这没有意义。但我在不同的应用程序中遇到了相同的问题。如果我删除
ServicedComponent
s并再次(手动)添加它们,一切正常。因此,使用
RegistrationHelper.InstallAssembly
将组件注册为32位。这没有意义,InstallAssembly直接写入注册表项。确保您的项目没有将目标平台设置为x86。这是VS2010的默认设置。不,这没有意义。但我在不同的应用程序中遇到了相同的问题。如果我删除
ServicedComponent
s并再次(手动)添加它们,一切正常。因此,请使用
RegistrationHelper.InstallAssembly
将组件注册为32位。该应用程序使用AnyCPU编译,并在64位计算机上运行,Windows Server 2008 x64作为操作系统。我将以x64格式重新编译应用程序,然后重试。该应用程序使用AnyCPU编译,并在64位计算机上运行,Windows Server 2008 x64作为操作系统。我将把应用程序重新编译为x64,然后重试。
    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"));
        }

    }