无法在64位应用程序中实例化在VBA中使用Visual Studio 2008构建的COM库

时间:2011-04-23 02:30:50

标签: c# .net com excel-2010

我正在尝试构建一个可以使用64位excel 2010从VBA注册和使用的对象库。我正在使用Dev Studio 2008.我认为这是一个64位问题,因为我很确定这在我尝试时有效它与我以前版本的Excel(XP)。我在Assembly Info信息对话框中单击了“Make COM visible”,并在build标签中单击“Register for COM interop”。当我将目标类型设置为x64时,根本无法在引用对话框中看到该库。如果我选择任何CPU,我可以注册它,但当我尝试实例化它时,我得到一个“无法创建Active X对象”错误。

namespace Tester
{
    [Guid("D6F88E95-8A27-4ae6-B6DE-0542A0FC7039")]
    [InterfaceType(ComInterfaceType.InterfaceIsDual)]
    public interface _Numbers
    {       
        int GetDay();
        int GetMonth();
        int GetYear();
        int DayOfYear();
    }

    [Guid("13FE32AD-4BF8-495f-AB4D-6C61BD463EA4")]
    [ClassInterface(ClassInterfaceType.None)]
    [ProgId("Tester.Numbers")]
    public class Numbers : _Numbers
    {
        public Numbers(){}

        public int GetDay()
        {
            return(DateTime.Today.Day);
        }

        public int GetMonth()
        {
            return(DateTime.Today.Month);
        }

        public int GetYear()
        {
            return(DateTime.Today.Year);
        }

        public int DayOfYear()
        {
            return(DateTime.Now.DayOfYear);
        }
    }
}

1 个答案:

答案 0 :(得分:1)

由于Visual Studio是一个32位进程,它将错误地运行32位版本的regasm.exe以注册您的64位程序集。当然,regasm.exe的那个版本将写入注册表的32位部分,因此无效。

解决问题的一种方法是自己在目标程序集上运行64位版本的regasm.exe(例如,在构建后的步骤中)。您需要使用/tlb选项导出其类型库,并且您还需要传递/codebase选项,因为程序集不在GAC中:

"%SystemRoot%\Microsoft.NET\Framework64\v2.0.50727\regasm.exe"
    /tlb /codebase "$(TargetPath)"