1

我正在尝试构建一个可以使用 64 位 excel 2010 从 VBA 注册和使用的对象库。我正在使用 Dev Studio 2008。我认为这是一个 64 位问题,因为我很确定当我尝试使用它时它有效我以前版本的 Excel (XP)。我在“程序集信息信息”对话框中单击了“使 COM 可见”,并在构建标记中单击了“注册 COM 互操作”。当我将目标类型设置为 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);
        }
    }
}
4

1 回答 1

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)"
于 2011-04-24T05:49:11.680 回答